{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://nupty.app/ai/handoff.v1.schema.json","title":"nupty.handoff v1","description":"A wedding plan an AI assistant prepared with a couple, handed to Nupty. Everything except \"v\" is optional: omit what the couple has not decided. Names only for guests — no e-mail addresses, phone numbers, dietary or health details, links or payment data.","type":"object","properties":{"v":{"description":"Schema version. Always 1.","const":1},"lang":{"description":"The language of the plan and the planner.","type":"string","enum":["en","hu"]},"source":{"description":"Which assistant prepared it (e.g. \"chatgpt\", \"claude\"). Attribution only.","type":"string","minLength":1,"maxLength":20,"pattern":"^[a-z0-9][a-z0-9 ._-]*$"},"couple":{"type":"object","properties":{"partner1":{"description":"A first name (letters, spaces, - ' . only).","type":"string","minLength":1,"maxLength":80,"pattern":"^[\\p{L}\\p{M}][\\p{L}\\p{M} .'’-]*$"},"partner2":{"description":"A first name (letters, spaces, - ' . only).","type":"string","minLength":1,"maxLength":80,"pattern":"^[\\p{L}\\p{M}][\\p{L}\\p{M} .'’-]*$"}},"additionalProperties":false},"date":{"description":"An exact date, a month, or a season. Omit if undecided.","anyOf":[{"type":"object","properties":{"exact":{"description":"YYYY-MM-DD","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["exact"],"additionalProperties":false},{"type":"object","properties":{"month":{"description":"YYYY-MM","type":"string","pattern":"^\\d{4}-(0[1-9]|1[0-2])$"}},"required":["month"],"additionalProperties":false},{"type":"object","properties":{"season":{"type":"string","enum":["spring","summer","autumn","winter"]},"year":{"type":"integer","minimum":2000,"maximum":2100}},"required":["season"],"additionalProperties":false}]},"place":{"type":"object","properties":{"country":{"description":"ISO 3166-1 alpha-2","type":"string","enum":["AD","AE","AF","AG","AI","AL","AM","AO","AQ","AR","AS","AT","AU","AW","AX","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BL","BM","BN","BO","BQ","BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CR","CU","CV","CW","CX","CY","CZ","DE","DJ","DK","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ","FK","FM","FO","FR","GA","GB","GD","GE","GF","GG","GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT","GU","GW","GY","HK","HM","HN","HR","HT","HU","ID","IE","IL","IM","IN","IO","IQ","IR","IS","IT","JE","JM","JO","JP","KE","KG","KH","KI","KM","KN","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","ME","MF","MG","MH","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY","QA","RE","RO","RS","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","SS","ST","SV","SX","SY","SZ","TC","TD","TF","TG","TH","TJ","TK","TL","TM","TN","TO","TR","TT","TV","TW","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","YE","YT","ZA","ZM","ZW"]},"region":{"description":"Town or area, e.g. \"Lake Balaton\".","type":"string","minLength":1,"maxLength":80}},"additionalProperties":false},"guests":{"description":"Roughly how many guests.","type":"integer","minimum":1,"maximum":1000},"budget":{"type":"object","properties":{"total":{"type":"integer","minimum":0,"maximum":10000000000},"currency":{"description":"ISO 4217","type":"string","enum":["HUF","EUR","GBP","USD","CHF","RON","CZK","PLN","SEK","NOK","DKK","CAD","AUD"]}},"additionalProperties":false},"ceremony":{"type":"string","enum":["civil","religious","both"]},"style":{"description":"blush = romantic pastel, midnight = classic dark, industrial, garden = botanical, golden = warm dark (golden hour).","type":"string","enum":["blush","midnight","industrial","garden","golden"]},"priorities":{"description":"What matters most, as vendor category ids.","type":"array","items":{"type":"string","enum":["venue","stay","ceremonyloc","rentals","catering","cake","bar","sweets","latenight","officiant","rings","cermusic","music","booth","fireworks","kids","entertainment","photo","video","drone","creator","florist","decor","stationery","lighting","dress","suit","hair","alter","bridesmaids","transport","planner","gifts","honeymoon","favours"]},"maxItems":5},"vendors":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"item":{"description":"A Nupty vendor category id.","type":"string","enum":["venue","stay","ceremonyloc","rentals","catering","cake","bar","sweets","latenight","officiant","rings","cermusic","music","booth","fireworks","kids","entertainment","photo","video","drone","creator","florist","decor","stationery","lighting","dress","suit","hair","alter","bridesmaids","transport","planner","gifts","honeymoon","favours"]},"name":{"description":"The vendor's name, if the couple has one in mind.","type":"string","minLength":1,"maxLength":120},"price":{"description":"Quoted price, whole units of budget.currency.","type":"integer","minimum":0,"maximum":10000000000},"note":{"type":"string","minLength":1,"maxLength":500}},"required":["item"],"additionalProperties":false},{"type":"object","properties":{"custom":{"description":"A vendor type Nupty has no category for.","type":"string","minLength":1,"maxLength":120},"category":{"type":"string","enum":["place","food","ceremony","music","media","look","attire","logistics"]},"name":{"description":"The vendor's name, if the couple has one in mind.","type":"string","minLength":1,"maxLength":120},"price":{"description":"Quoted price, whole units of budget.currency.","type":"integer","minimum":0,"maximum":10000000000},"note":{"type":"string","minLength":1,"maxLength":500}},"required":["custom"],"additionalProperties":false}]},"maxItems":30},"guestList":{"type":"array","items":{"type":"object","properties":{"name":{"description":"\"Kati Nagy\" or \"Tamás & Éva Kovács\". Names only.","type":"string","minLength":1,"maxLength":160,"pattern":"^[\\p{L}\\p{M}][\\p{L}\\p{M} .'’&+-]*$"},"plusOne":{"type":"boolean"},"kids":{"type":"integer","minimum":0,"maximum":10},"side":{"type":"string","enum":["p1","p2","both"]},"group":{"type":"string","enum":["family","friends","university","work","neighbours"]}},"required":["name"],"additionalProperties":false},"maxItems":300},"timeline":{"type":"array","items":{"type":"object","properties":{"time":{"description":"HH:MM, 24-hour","type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"name":{"type":"string","minLength":1,"maxLength":120}},"required":["time","name"],"additionalProperties":false},"maxItems":30},"todos":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"due":{"description":"YYYY-MM-DD","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["title"],"additionalProperties":false},"maxItems":50}},"required":["v"],"additionalProperties":false}