{"openapi":"3.1.0","info":{"title":"Nupty API","version":"1.0.0","description":"Read and change a couple’s wedding plan with a personal API key (Settings → API keys). Every change is one command, validated and applied exactly like the planner does, so the API can do what the couple can do by hand — nothing more. Premium features stay Premium. Ids of new things (options, invitations, moments…) are chosen by the caller: any 1–64 character string unique within the wedding, e.g. 8 random letters. AI assistants with MCP connectors (Claude, ChatGPT, Le Chat) use the remote MCP server at /mcp on the same host instead (OAuth sign-in by the couple; previews before removals; undo per change set).","contact":{"email":"hello@nupty.app"}},"externalDocs":{"url":"https://nupty.app/en-us/ai/","description":"For AI assistants"},"servers":[{"url":"https://my.nupty.app"}],"security":[{"apiKey":[]}],"tags":[{"name":"Wedding","description":"The couple’s plan"}],"paths":{"/api/v2/wedding":{"get":{"tags":["Wedding"],"operationId":"getWedding","summary":"Read the whole wedding (scope: read)","responses":{"200":{"description":"The wedding and its revision","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Snapshot"}}}},"401":{"description":"Missing, wrong or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v2/wedding/revision":{"get":{"tags":["Wedding"],"operationId":"getRevision","summary":"Cheap freshness check (scope: read)","responses":{"200":{"description":"The current revision","content":{"application/json":{"schema":{"type":"object","properties":{"revision":{"type":"integer"}}}}}},"401":{"description":"Missing, wrong or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v2/wedding/commands":{"post":{"tags":["Wedding"],"operationId":"sendCommand","summary":"Change the wedding with one command (scope: read + write)","description":"Applied atomically; the answer is the whole new wedding. Send commands one at a time, in order.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["command"],"properties":{"command":{"$ref":"#/components/schemas/Command"}}}}}},"responses":{"200":{"description":"Applied: the new wedding","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Snapshot"}}}},"400":{"description":"INVALID_COMMAND: the command does not match the schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, wrong or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"API_KEY_SCOPE (a read-only key), SERVER_ONLY, or PREMIUM_REQUIRED (with reason)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"CONFLICT / INVARIANT: the plan changed meanwhile or the change would leave it inconsistent — read and retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The planner said no (e.g. PARTY_SHAPE, TABLE_FULL, ITEM_NOT_FOUND); the code says why","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests for this key — slow down","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","bearerFormat":"nupty_…","description":"Authorization: Bearer <personal API key>. Never put a key in a URL."}},"schemas":{"Error":{"type":"object","required":["statusCode","code","message"],"properties":{"statusCode":{"type":"integer"},"code":{"type":"string"},"message":{"type":"string"},"reason":{"type":"string","description":"PREMIUM_REQUIRED: which Premium feature"}}},"Snapshot":{"type":"object","required":["revision","wedding"],"properties":{"revision":{"type":"integer","description":"Bumps on every change"},"wedding":{"$ref":"#/components/schemas/Wedding"}}},"Wedding":{"type":"object","description":"The whole wedding: the one source of truth every planner screen reads. RSVP tokens are never included.","properties":{"schemaVersion":{"type":"integer"},"details":{"type":"object","properties":{"partner1Name":{"type":"string"},"partner2Name":{"type":"string"},"dateMode":{"type":"string","enum":["exact","month","unknown"]},"date":{"type":"string","description":"YYYY-MM-DD when dateMode = exact"},"month":{"type":"string","description":"YYYY-MM when dateMode = month"},"guestRange":{"anyOf":[{"type":"string","enum":["u50","50-80","80-120","120-180","180p"]},{"type":"null"}]},"ceremony":{"anyOf":[{"type":"string","enum":["civil","religious","both"]},{"type":"null"}]},"templateIndex":{"anyOf":[{"type":"integer","minimum":0,"maximum":3},{"type":"null"}]},"onboarded":{"type":"boolean"},"currency":{"type":"string","description":"ISO 4217; every amount in the wedding is whole units of it"},"budgetTarget":{"anyOf":[{"type":"integer"},{"type":"null"}]},"region":{"type":"object","properties":{"country":{"anyOf":[{"type":"string"},{"type":"null"}]},"city":{"type":"string"}}}}},"items":{"type":"array","description":"Vendor items (catalogue categories and the couple’s own). Inactive ones are suggestions.","items":{"type":"object","properties":{"id":{"type":"string"},"catalogId":{"anyOf":[{"type":"string"},{"type":"null"}]},"category":{"type":"string"},"name":{"type":"string"},"active":{"type":"boolean"},"status":{"type":"string","enum":["idea","comparing","booked","done","covered","notneeded"]},"budget":{"type":"integer"},"chosen":{"type":"array","items":{"type":"string"}},"options":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"model":{"type":"string"},"amount":{"type":"integer"},"pp":{"type":"integer"},"ppChild":{"type":"integer"},"notes":{"type":"string"}}}},"todos":{"type":"array","items":{"type":"object"}},"payments":{"type":"array","items":{"type":"object"}}}}},"todos":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"section":{"type":"string"},"due":{"type":"string"},"done":{"type":"boolean"}}}},"parties":{"type":"array","description":"Invitations. people[0] is the lead guest.","items":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string","enum":["single","plus1","couple","family"]},"people":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"child":{"type":"boolean"},"attending":{"anyOf":[{"type":"boolean"},{"type":"null"}]}}}},"side":{"type":"string","enum":["p1","p2","both"]},"group":{"type":"string"},"reply":{"type":"string","enum":["notinvited","waiting","yes","no"]}}}},"tables":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"shape":{"type":"string"},"capacity":{"type":"integer"},"seats":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"null"}]}},"pos":{"type":"object"}}}},"floor":{"type":"object","properties":{"width":{"type":"number"},"length":{"type":"number"},"elements":{"type":"array","items":{"type":"object"}}}},"dayVersions":{"type":"array","description":"Big Day versions; exactly one has isPlan = true (the plan).","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"isPlan":{"type":"boolean"},"moments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"time":{"type":"string"},"name":{"type":"string"},"lane":{"type":"string"},"icon":{"type":"string"},"durationMin":{"type":"integer"}}}}}}},"site":{"type":"object"},"menu":{"type":"object"},"billing":{"type":"object","description":"Premium state; billing.entitlements says what this couple may do now."}},"additionalProperties":true},"Command":{"oneOf":[{"$ref":"#/components/schemas/Command_setDetails"},{"$ref":"#/components/schemas/Command_finishOnboarding"},{"$ref":"#/components/schemas/Command_activateItem"},{"$ref":"#/components/schemas/Command_addCustomItem"},{"$ref":"#/components/schemas/Command_setItemStatus"},{"$ref":"#/components/schemas/Command_markItemCovered"},{"$ref":"#/components/schemas/Command_markItemNotNeeded"},{"$ref":"#/components/schemas/Command_undoItemBanner"},{"$ref":"#/components/schemas/Command_renameItem"},{"$ref":"#/components/schemas/Command_removeCustomItem"},{"$ref":"#/components/schemas/Command_restoreItem"},{"$ref":"#/components/schemas/Command_addItemNote"},{"$ref":"#/components/schemas/Command_updateItemNote"},{"$ref":"#/components/schemas/Command_removeItemNote"},{"$ref":"#/components/schemas/Command_restoreItemNote"},{"$ref":"#/components/schemas/Command_addOption"},{"$ref":"#/components/schemas/Command_updateOption"},{"$ref":"#/components/schemas/Command_setOptionField"},{"$ref":"#/components/schemas/Command_toggleOptionInclude"},{"$ref":"#/components/schemas/Command_rateOption"},{"$ref":"#/components/schemas/Command_toggleChosen"},{"$ref":"#/components/schemas/Command_setChosen"},{"$ref":"#/components/schemas/Command_removeOption"},{"$ref":"#/components/schemas/Command_restoreOption"},{"$ref":"#/components/schemas/Command_setItemBudget"},{"$ref":"#/components/schemas/Command_addPayment"},{"$ref":"#/components/schemas/Command_updatePayment"},{"$ref":"#/components/schemas/Command_removePayment"},{"$ref":"#/components/schemas/Command_restorePayment"},{"$ref":"#/components/schemas/Command_addTodo"},{"$ref":"#/components/schemas/Command_updateTodo"},{"$ref":"#/components/schemas/Command_pinTodo"},{"$ref":"#/components/schemas/Command_movePinnedTodo"},{"$ref":"#/components/schemas/Command_toggleTodo"},{"$ref":"#/components/schemas/Command_removeTodo"},{"$ref":"#/components/schemas/Command_dismissSuggestion"},{"$ref":"#/components/schemas/Command_restoreSuggestion"},{"$ref":"#/components/schemas/Command_addParty"},{"$ref":"#/components/schemas/Command_addParties"},{"$ref":"#/components/schemas/Command_updateParty"},{"$ref":"#/components/schemas/Command_removeParties"},{"$ref":"#/components/schemas/Command_setReply"},{"$ref":"#/components/schemas/Command_setInvited"},{"$ref":"#/components/schemas/Command_newRsvpLink"},{"$ref":"#/components/schemas/Command_revertToGuestAnswer"},{"$ref":"#/components/schemas/Command_updateRsvpSettings"},{"$ref":"#/components/schemas/Command_setBusPickupPlace"},{"$ref":"#/components/schemas/Command_seatParty"},{"$ref":"#/components/schemas/Command_addTable"},{"$ref":"#/components/schemas/Command_updateTable"},{"$ref":"#/components/schemas/Command_removeTable"},{"$ref":"#/components/schemas/Command_seat"},{"$ref":"#/components/schemas/Command_unseat"},{"$ref":"#/components/schemas/Command_seatFirstFree"},{"$ref":"#/components/schemas/Command_unseatOne"},{"$ref":"#/components/schemas/Command_applySeatingPreset"},{"$ref":"#/components/schemas/Command_addTablesLike"},{"$ref":"#/components/schemas/Command_removeTables"},{"$ref":"#/components/schemas/Command_moveTable"},{"$ref":"#/components/schemas/Command_rotateTable"},{"$ref":"#/components/schemas/Command_setFloorSize"},{"$ref":"#/components/schemas/Command_addFloorElement"},{"$ref":"#/components/schemas/Command_updateFloorElement"},{"$ref":"#/components/schemas/Command_removeFloorElement"},{"$ref":"#/components/schemas/Command_createVersion"},{"$ref":"#/components/schemas/Command_renameVersion"},{"$ref":"#/components/schemas/Command_removeVersion"},{"$ref":"#/components/schemas/Command_restoreVersion"},{"$ref":"#/components/schemas/Command_makePlan"},{"$ref":"#/components/schemas/Command_useOptionInPlan"},{"$ref":"#/components/schemas/Command_useMomentInPlan"},{"$ref":"#/components/schemas/Command_addMoment"},{"$ref":"#/components/schemas/Command_updateMoment"},{"$ref":"#/components/schemas/Command_moveMoment"},{"$ref":"#/components/schemas/Command_linkMoment"},{"$ref":"#/components/schemas/Command_createItemForMoment"},{"$ref":"#/components/schemas/Command_setMomentOption"},{"$ref":"#/components/schemas/Command_addOptionForMoment"},{"$ref":"#/components/schemas/Command_setMomentItemStatus"},{"$ref":"#/components/schemas/Command_duplicateMoment"},{"$ref":"#/components/schemas/Command_removeMoment"},{"$ref":"#/components/schemas/Command_addItemToDay"},{"$ref":"#/components/schemas/Command_setTemplate"},{"$ref":"#/components/schemas/Command_setAccent"},{"$ref":"#/components/schemas/Command_newSiteLink"},{"$ref":"#/components/schemas/Command_setSiteSection"},{"$ref":"#/components/schemas/Command_moveSiteSection"},{"$ref":"#/components/schemas/Command_setSitePublished"},{"$ref":"#/components/schemas/Command_updateSite"},{"$ref":"#/components/schemas/Command_updatePhoto"},{"$ref":"#/components/schemas/Command_removePhoto"},{"$ref":"#/components/schemas/Command_setDesignStatus"},{"$ref":"#/components/schemas/Command_setDesignText"},{"$ref":"#/components/schemas/Command_setDesignPhotos"},{"$ref":"#/components/schemas/Command_setDesignStyle"},{"$ref":"#/components/schemas/Command_addMenuSection"},{"$ref":"#/components/schemas/Command_renameMenuSection"},{"$ref":"#/components/schemas/Command_moveMenuSection"},{"$ref":"#/components/schemas/Command_removeMenuSection"},{"$ref":"#/components/schemas/Command_restoreMenuSection"},{"$ref":"#/components/schemas/Command_addMenuItem"},{"$ref":"#/components/schemas/Command_updateMenuItem"},{"$ref":"#/components/schemas/Command_moveMenuItem"},{"$ref":"#/components/schemas/Command_removeMenuItem"},{"$ref":"#/components/schemas/Command_restoreMenuItem"}],"discriminator":{"propertyName":"type"}},"Command_setDetails":{"title":"setDetails","description":"Details: Set wedding details: names, date (exact / month / unknown), guest range or the exact guest estimate (guestCount; it sets the range), ceremony, style template, time format, whether the Big Day board shows prices (showPrices), currency, total budget target, region. Only the given fields change; currency never converts amounts.","type":"object","properties":{"type":{"const":"setDetails"},"patch":{"type":"object","properties":{"partner1Name":{"type":"string","maxLength":80},"partner2Name":{"type":"string","maxLength":80},"dateMode":{"type":"string","enum":["exact","month","unknown"]},"date":{"anyOf":[{"const":""},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"month":{"anyOf":[{"const":""},{"type":"string","pattern":"^\\d{4}-\\d{2}$"}]},"guestRange":{"anyOf":[{"type":"string","enum":["u50","50-80","80-120","120-180","180p"]},{"type":"null"}]},"ceremony":{"anyOf":[{"type":"string","enum":["civil","religious","both"]},{"type":"null"}]},"templateIndex":{"anyOf":[{"type":"integer","minimum":0,"maximum":4},{"type":"null"}]},"timeFormat":{"anyOf":[{"type":"string","enum":["24h","12h"]},{"type":"null"}]},"showPrices":{"type":"boolean"},"currency":{"type":"string","enum":["HUF","EUR","GBP","USD","CHF","RON","CZK","PLN","SEK","NOK","DKK","CAD","AUD"]},"budgetTarget":{"anyOf":[{"type":"integer","minimum":0,"maximum":10000000000},{"type":"null"}]},"guestCount":{"anyOf":[{"type":"integer","minimum":1,"maximum":5000},{"type":"null"}]},"region":{"type":"object","properties":{"country":{"anyOf":[{"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"]},{"type":"null"}]},"city":{"type":"string","maxLength":120}}}}}},"required":["type","patch"]},"Command_finishOnboarding":{"title":"finishOnboarding","description":"Details: Mark the first-run questions as answered (the planner stops asking them).","type":"object","properties":{"type":{"const":"finishOnboarding"}},"required":["type"]},"Command_activateItem":{"title":"activateItem","description":"Vendors: Add a suggested vendor category (e.g. \"fireworks\", \"bar\") to the vendor list.","type":"object","properties":{"type":{"const":"activateItem"},"itemId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","itemId"]},"Command_addCustomItem":{"title":"addCustomItem","description":"Vendors: Add the couple's own vendor type (id chosen by the caller), in a category.","type":"object","properties":{"type":{"const":"addCustomItem"},"id":{"type":"string","minLength":1,"maxLength":64},"category":{"type":"string","enum":["place","food","ceremony","music","media","look","attire","logistics"]},"name":{"type":"string","maxLength":120,"minLength":1}},"required":["type","id","category","name"]},"Command_setItemStatus":{"title":"setItemStatus","description":"Vendors: Set a vendor status: idea, comparing, booked or done.","type":"object","properties":{"type":{"const":"setItemStatus"},"itemId":{"type":"string","minLength":1,"maxLength":64},"status":{"type":"string","enum":["idea","comparing","booked","done"]}},"required":["type","itemId","status"]},"Command_markItemCovered":{"title":"markItemCovered","description":"Vendors: Mark a vendor as included in the venue package.","type":"object","properties":{"type":{"const":"markItemCovered"},"itemId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","itemId"]},"Command_markItemNotNeeded":{"title":"markItemNotNeeded","description":"Vendors: Mark a vendor as not needed.","type":"object","properties":{"type":{"const":"markItemNotNeeded"},"itemId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","itemId"]},"Command_undoItemBanner":{"title":"undoItemBanner","description":"Vendors: Undo \"covered\" / \"not needed\" (back to idea or comparing).","type":"object","properties":{"type":{"const":"undoItemBanner"},"itemId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","itemId"]},"Command_renameItem":{"title":"renameItem","description":"Vendors: Give a vendor item the couple's own name; on a catalogue item an empty name goes back to the catalogue name.","type":"object","properties":{"type":{"const":"renameItem"},"itemId":{"type":"string","minLength":1,"maxLength":64},"name":{"type":"string","maxLength":120}},"required":["type","itemId","name"]},"Command_removeCustomItem":{"title":"removeCustomItem","description":"Vendors: Delete one of the couple's own vendor items (catalogue items can only be marked not needed). Its moments stay, unlinked.","type":"object","properties":{"type":{"const":"removeCustomItem"},"itemId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","itemId"]},"Command_restoreItem":{"title":"restoreItem","description":"Vendors: Put a deleted own vendor item back with its options, to-dos, payments and notes, re-linking its moments (undo).","type":"object","properties":{"type":{"const":"restoreItem"},"item":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64},"catalogId":{"type":"null"},"category":{"type":"string","enum":["place","food","ceremony","music","media","look","attire","logistics"]},"name":{"type":"string","maxLength":120,"minLength":1},"active":{"type":"boolean"},"status":{"type":"string","enum":["idea","comparing","booked","done","covered","notneeded"]},"budget":{"type":"integer","minimum":0,"maximum":10000000000},"chosen":{"type":"array","items":{"type":"string","minLength":1,"maxLength":64},"maxItems":50},"coveredByVenue":{"type":"boolean"},"statusBeforeVenue":{"anyOf":[{"type":"string","enum":["idea","comparing","booked","done","covered","notneeded"]},{"type":"null"}]},"custom":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["venue","stay","catering","music","photo","video","attire","basic"]},"bookMonths":{"type":"integer","minimum":0,"maximum":36},"phase":{"type":"integer","minimum":0,"maximum":6}},"required":["type","bookMonths","phase"]},{"type":"null"}]},"options":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64},"name":{"type":"string","maxLength":200},"model":{"type":"string","enum":["fixed","pp","fixed+pp"]},"amount":{"type":"integer","minimum":0,"maximum":10000000000},"pp":{"type":"integer","minimum":0,"maximum":10000000000},"ppChild":{"type":"integer","minimum":0,"maximum":10000000000},"ratings":{"type":"array","prefixItems":[{"type":"integer","minimum":0,"maximum":5},{"type":"integer","minimum":0,"maximum":5}],"minItems":2,"maxItems":2},"contact":{"type":"string","maxLength":300},"web":{"type":"string","maxLength":300},"notes":{"type":"string","maxLength":2000},"fields":{"type":"object","additionalProperties":{"type":"string","maxLength":300},"propertyNames":{"type":"string","maxLength":40}},"includes":{"type":"array","items":{"type":"string","enum":["catering","stay","decor","music","rentals"]}}},"required":["id","name","model","amount","pp","ppChild","ratings","contact","web","notes","fields","includes"]},"maxItems":200},"todos":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64},"title":{"type":"string","maxLength":300,"minLength":1},"done":{"type":"boolean"},"doneOn":{"anyOf":[{"const":""},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"phase":{"type":"integer","minimum":0,"maximum":6},"due":{"anyOf":[{"const":""},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"notes":{"type":"string","maxLength":2000},"pin":{"type":"integer","minimum":0,"maximum":1000000}},"required":["id","title","done","doneOn","phase","due"]},"maxItems":500},"payments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64},"label":{"type":"string","maxLength":200},"amount":{"type":"integer","minimum":0,"maximum":10000000000},"due":{"anyOf":[{"const":""},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"paid":{"type":"boolean"}},"required":["id","label","amount","due","paid"]},"maxItems":200},"notes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64},"date":{"anyOf":[{"const":""},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"text":{"type":"string","maxLength":2000,"minLength":1}},"required":["id","date","text"]},"maxItems":500}},"required":["id","catalogId","category","name","active","status","budget","chosen","coveredByVenue","statusBeforeVenue","custom","options","todos","payments"]},"index":{"type":"integer","minimum":0,"maximum":10000},"links":{"type":"array","items":{"type":"object","properties":{"versionId":{"type":"string","minLength":1,"maxLength":64},"momentId":{"type":"string","minLength":1,"maxLength":64}},"required":["versionId","momentId"]},"maxItems":50},"picks":{"type":"object","additionalProperties":{"anyOf":[{"type":"string","minLength":1,"maxLength":64},{"type":"null"}]},"propertyNames":{"type":"string","minLength":1,"maxLength":64}}},"required":["type","item","index","links"]},"Command_addItemNote":{"title":"addItemNote","description":"Vendors: Add a dated entry to a vendor's \"Agreements & notes\" log (date YYYY-MM-DD or empty; multi-line text).","type":"object","properties":{"type":{"const":"addItemNote"},"itemId":{"type":"string","minLength":1,"maxLength":64},"noteId":{"type":"string","minLength":1,"maxLength":64},"date":{"anyOf":[{"const":""},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"text":{"type":"string","maxLength":2000}},"required":["type","itemId","noteId","date","text"]},"Command_updateItemNote":{"title":"updateItemNote","description":"Vendors: Change the date or text of an \"Agreements & notes\" entry.","type":"object","properties":{"type":{"const":"updateItemNote"},"itemId":{"type":"string","minLength":1,"maxLength":64},"noteId":{"type":"string","minLength":1,"maxLength":64},"patch":{"type":"object","properties":{"date":{"anyOf":[{"const":""},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"text":{"type":"string","maxLength":2000}}}},"required":["type","itemId","noteId","patch"]},"Command_removeItemNote":{"title":"removeItemNote","description":"Vendors: Remove an \"Agreements & notes\" entry.","type":"object","properties":{"type":{"const":"removeItemNote"},"itemId":{"type":"string","minLength":1,"maxLength":64},"noteId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","itemId","noteId"]},"Command_restoreItemNote":{"title":"restoreItemNote","description":"Vendors: Put a removed \"Agreements & notes\" entry back (undo).","type":"object","properties":{"type":{"const":"restoreItemNote"},"itemId":{"type":"string","minLength":1,"maxLength":64},"note":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64},"date":{"anyOf":[{"const":""},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"text":{"type":"string","maxLength":2000,"minLength":1}},"required":["id","date","text"]},"index":{"type":"integer","minimum":0,"maximum":10000}},"required":["type","itemId","note","index"]},"Command_addOption":{"title":"addOption","description":"Vendors: Add an option (a concrete vendor / offer) to compare under a vendor item; optional name and fixed amount.","type":"object","properties":{"type":{"const":"addOption"},"itemId":{"type":"string","minLength":1,"maxLength":64},"optionId":{"type":"string","minLength":1,"maxLength":64},"name":{"type":"string","maxLength":200},"amount":{"type":"integer","minimum":0,"maximum":10000000000}},"required":["type","itemId","optionId"]},"Command_updateOption":{"title":"updateOption","description":"Vendors: Change an option: name, price model (fixed / per person / both), amounts, contact, web, notes.","type":"object","properties":{"type":{"const":"updateOption"},"itemId":{"type":"string","minLength":1,"maxLength":64},"optionId":{"type":"string","minLength":1,"maxLength":64},"patch":{"type":"object","properties":{"name":{"type":"string","maxLength":200},"model":{"type":"string","enum":["fixed","pp","fixed+pp"]},"amount":{"type":"integer","minimum":0,"maximum":10000000000},"pp":{"type":"integer","minimum":0,"maximum":10000000000},"ppChild":{"type":"integer","minimum":0,"maximum":10000000000},"contact":{"type":"string","maxLength":300},"web":{"type":"string","maxLength":300},"notes":{"type":"string","maxLength":2000}}}},"required":["type","itemId","optionId","patch"]},"Command_setOptionField":{"title":"setOptionField","description":"Vendors: Set a comparison field of an option (e.g. capacity, style).","type":"object","properties":{"type":{"const":"setOptionField"},"itemId":{"type":"string","minLength":1,"maxLength":64},"optionId":{"type":"string","minLength":1,"maxLength":64},"key":{"type":"string","maxLength":40,"minLength":1},"value":{"type":"string","maxLength":300}},"required":["type","itemId","optionId","key","value"]},"Command_toggleOptionInclude":{"title":"toggleOptionInclude","description":"Vendors: Venue options: toggle what the venue package includes (catering, stay, decor, music, rentals).","type":"object","properties":{"type":{"const":"toggleOptionInclude"},"itemId":{"type":"string","minLength":1,"maxLength":64},"optionId":{"type":"string","minLength":1,"maxLength":64},"key":{"type":"string","enum":["catering","stay","decor","music","rentals"]}},"required":["type","itemId","optionId","key"]},"Command_rateOption":{"title":"rateOption","description":"Vendors: Rate an option 1–5 for one partner (the same stars again clears it).","type":"object","properties":{"type":{"const":"rateOption"},"itemId":{"type":"string","minLength":1,"maxLength":64},"optionId":{"type":"string","minLength":1,"maxLength":64},"partner":{"anyOf":[{"const":0},{"const":1}]},"stars":{"type":"integer","minimum":1,"maximum":5}},"required":["type","itemId","optionId","partner","stars"]},"Command_toggleChosen":{"title":"toggleChosen","description":"Vendors: Choose / un-choose an option (multi-choice items keep several).","type":"object","properties":{"type":{"const":"toggleChosen"},"itemId":{"type":"string","minLength":1,"maxLength":64},"optionId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","itemId","optionId"]},"Command_setChosen":{"title":"setChosen","description":"Vendors: Choose exactly this option (null = none).","type":"object","properties":{"type":{"const":"setChosen"},"itemId":{"type":"string","minLength":1,"maxLength":64},"optionId":{"anyOf":[{"type":"string","minLength":1,"maxLength":64},{"type":"null"}]}},"required":["type","itemId","optionId"]},"Command_removeOption":{"title":"removeOption","description":"Vendors: Remove an option.","type":"object","properties":{"type":{"const":"removeOption"},"itemId":{"type":"string","minLength":1,"maxLength":64},"optionId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","itemId","optionId"]},"Command_restoreOption":{"title":"restoreOption","description":"Vendors: Put a removed option back (undo).","type":"object","properties":{"type":{"const":"restoreOption"},"itemId":{"type":"string","minLength":1,"maxLength":64},"option":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64},"name":{"type":"string","maxLength":200},"model":{"type":"string","enum":["fixed","pp","fixed+pp"]},"amount":{"type":"integer","minimum":0,"maximum":10000000000},"pp":{"type":"integer","minimum":0,"maximum":10000000000},"ppChild":{"type":"integer","minimum":0,"maximum":10000000000},"ratings":{"type":"array","prefixItems":[{"type":"integer","minimum":0,"maximum":5},{"type":"integer","minimum":0,"maximum":5}],"minItems":2,"maxItems":2},"contact":{"type":"string","maxLength":300},"web":{"type":"string","maxLength":300},"notes":{"type":"string","maxLength":2000},"fields":{"type":"object","additionalProperties":{"type":"string","maxLength":300},"propertyNames":{"type":"string","maxLength":40}},"includes":{"type":"array","items":{"type":"string","enum":["catering","stay","decor","music","rentals"]}}},"required":["id","name","model","amount","pp","ppChild","ratings","contact","web","notes","fields","includes"]},"index":{"type":"integer","minimum":0,"maximum":10000},"chosen":{"type":"boolean"},"pickedIn":{"type":"array","items":{"type":"string","minLength":1,"maxLength":64},"maxItems":20}},"required":["type","itemId","option","index","chosen","pickedIn"]},"Command_setItemBudget":{"title":"setItemBudget","description":"Budget: Set the budget of one vendor item (0 = none).","type":"object","properties":{"type":{"const":"setItemBudget"},"itemId":{"type":"string","minLength":1,"maxLength":64},"budget":{"type":"integer","minimum":0,"maximum":10000000000}},"required":["type","itemId","budget"]},"Command_addPayment":{"title":"addPayment","description":"Budget: Add a payment to a vendor item.","type":"object","properties":{"type":{"const":"addPayment"},"itemId":{"type":"string","minLength":1,"maxLength":64},"paymentId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","itemId","paymentId"]},"Command_updatePayment":{"title":"updatePayment","description":"Budget: Change a payment: label, amount, due date, paid.","type":"object","properties":{"type":{"const":"updatePayment"},"itemId":{"type":"string","minLength":1,"maxLength":64},"paymentId":{"type":"string","minLength":1,"maxLength":64},"patch":{"type":"object","properties":{"label":{"type":"string","maxLength":200},"amount":{"type":"integer","minimum":0,"maximum":10000000000},"due":{"anyOf":[{"const":""},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"paid":{"type":"boolean"}}}},"required":["type","itemId","paymentId","patch"]},"Command_removePayment":{"title":"removePayment","description":"Budget: Remove a payment.","type":"object","properties":{"type":{"const":"removePayment"},"itemId":{"type":"string","minLength":1,"maxLength":64},"paymentId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","itemId","paymentId"]},"Command_restorePayment":{"title":"restorePayment","description":"Budget: Put a removed payment back (undo).","type":"object","properties":{"type":{"const":"restorePayment"},"itemId":{"type":"string","minLength":1,"maxLength":64},"payment":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64},"label":{"type":"string","maxLength":200},"amount":{"type":"integer","minimum":0,"maximum":10000000000},"due":{"anyOf":[{"const":""},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"paid":{"type":"boolean"}},"required":["id","label","amount","due","paid"]},"index":{"type":"integer","minimum":0,"maximum":10000}},"required":["type","itemId","payment","index"]},"Command_addTodo":{"title":"addTodo","description":"To-dos: Add a to-do, either general (with a section) or on a vendor item, with optional multi-line notes.","type":"object","properties":{"type":{"const":"addTodo"},"todoId":{"type":"string","minLength":1,"maxLength":64},"title":{"type":"string","maxLength":300},"due":{"anyOf":[{"const":""},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"target":{"anyOf":[{"type":"object","properties":{"section":{"type":"string","enum":["general","guests","bigday","studio","budget"]}},"required":["section"]},{"type":"object","properties":{"itemId":{"type":"string","minLength":1,"maxLength":64}},"required":["itemId"]}]},"notes":{"type":"string","maxLength":2000}},"required":["type","todoId","title","due","target"]},"Command_updateTodo":{"title":"updateTodo","description":"To-dos: Change a to-do: title, due date, section, notes (empty = none).","type":"object","properties":{"type":{"const":"updateTodo"},"todoId":{"type":"string","minLength":1,"maxLength":64},"itemId":{"anyOf":[{"type":"string","minLength":1,"maxLength":64},{"type":"null"}]},"patch":{"type":"object","properties":{"title":{"type":"string","maxLength":300},"due":{"anyOf":[{"const":""},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"section":{"type":"string","enum":["general","guests","bigday","studio","budget"]},"notes":{"type":"string","maxLength":2000}}}},"required":["type","todoId","itemId","patch"]},"Command_pinTodo":{"title":"pinTodo","description":"To-dos: Pin one of the couple's own to-dos to the top of the list (pinned: false unpins).","type":"object","properties":{"type":{"const":"pinTodo"},"todoId":{"type":"string","minLength":1,"maxLength":64},"itemId":{"anyOf":[{"type":"string","minLength":1,"maxLength":64},{"type":"null"}]},"pinned":{"type":"boolean"}},"required":["type","todoId","itemId","pinned"]},"Command_movePinnedTodo":{"title":"movePinnedTodo","description":"To-dos: Move a pinned to-do up (-1) or down (1) among the pinned ones.","type":"object","properties":{"type":{"const":"movePinnedTodo"},"todoId":{"type":"string","minLength":1,"maxLength":64},"itemId":{"anyOf":[{"type":"string","minLength":1,"maxLength":64},{"type":"null"}]},"dir":{"anyOf":[{"const":-1},{"const":1}]}},"required":["type","todoId","itemId","dir"]},"Command_toggleTodo":{"title":"toggleTodo","description":"To-dos: Tick / untick a to-do.","type":"object","properties":{"type":{"const":"toggleTodo"},"todoId":{"type":"string","minLength":1,"maxLength":64},"itemId":{"anyOf":[{"type":"string","minLength":1,"maxLength":64},{"type":"null"}]}},"required":["type","todoId","itemId"]},"Command_removeTodo":{"title":"removeTodo","description":"To-dos: Remove a to-do.","type":"object","properties":{"type":{"const":"removeTodo"},"todoId":{"type":"string","minLength":1,"maxLength":64},"itemId":{"anyOf":[{"type":"string","minLength":1,"maxLength":64},{"type":"null"}]}},"required":["type","todoId","itemId"]},"Command_dismissSuggestion":{"title":"dismissSuggestion","description":"To-dos: Hide a suggested to-do.","type":"object","properties":{"type":{"const":"dismissSuggestion"},"key":{"type":"string","maxLength":200,"minLength":1}},"required":["type","key"]},"Command_restoreSuggestion":{"title":"restoreSuggestion","description":"To-dos: Show a hidden suggestion again.","type":"object","properties":{"type":{"const":"restoreSuggestion"},"key":{"type":"string","maxLength":200,"minLength":1}},"required":["type","key"]},"Command_addParty":{"title":"addParty","description":"Guests: Add one invitation (a party: single, plus-one, couple or family) with its people. The caller chooses the ids; the server picks the RSVP token (send any 16–64 characters as `rsvpToken`; they are replaced). Read the link with GET /api/v2/guests/{partyId}/link.","type":"object","properties":{"type":{"const":"addParty"},"partyId":{"type":"string","minLength":1,"maxLength":64},"rsvpToken":{"type":"string","minLength":16,"maxLength":64},"party":{"type":"object","properties":{"type":{"type":"string","enum":["single","plus1","couple","family"]},"people":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64},"firstName":{"type":"string","maxLength":80},"lastName":{"type":"string","maxLength":80},"child":{"type":"boolean"},"diet":{"type":"string","maxLength":200},"dietTags":{"type":"array","items":{"type":"string","enum":["vegetarian","vegan","glutenfree","lactosefree","nutallergy","halal","kosher"]},"maxItems":7}},"required":["id","firstName","lastName","child","diet"]},"minItems":1,"maxItems":30},"side":{"type":"string","enum":["p1","p2","both"]},"group":{"type":"string","enum":["family","friends","university","work","neighbours"]},"priority":{"type":"string","enum":["must","maybe"]},"email":{"type":"string","maxLength":200},"phone":{"type":"string","maxLength":50},"lang":{"type":"string","enum":["EN","HU"]},"invitedTo":{"type":"string","enum":["whole","evening"]},"hotel":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"bus":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"notes":{"type":"string","maxLength":2000}},"required":["type","people","side","group","priority","email","phone","lang","invitedTo","hotel","bus","notes"]}},"required":["type","partyId","rsvpToken","party"]},"Command_addParties":{"title":"addParties","description":"Guests: Add up to 500 invitations at once (bulk import). The server picks every RSVP token, as for addParty.","type":"object","properties":{"type":{"const":"addParties"},"parties":{"type":"array","items":{"type":"object","properties":{"partyId":{"type":"string","minLength":1,"maxLength":64},"rsvpToken":{"type":"string","minLength":16,"maxLength":64},"party":{"type":"object","properties":{"type":{"type":"string","enum":["single","plus1","couple","family"]},"people":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64},"firstName":{"type":"string","maxLength":80},"lastName":{"type":"string","maxLength":80},"child":{"type":"boolean"},"diet":{"type":"string","maxLength":200},"dietTags":{"type":"array","items":{"type":"string","enum":["vegetarian","vegan","glutenfree","lactosefree","nutallergy","halal","kosher"]},"maxItems":7}},"required":["id","firstName","lastName","child","diet"]},"minItems":1,"maxItems":30},"side":{"type":"string","enum":["p1","p2","both"]},"group":{"type":"string","enum":["family","friends","university","work","neighbours"]},"priority":{"type":"string","enum":["must","maybe"]},"email":{"type":"string","maxLength":200},"phone":{"type":"string","maxLength":50},"lang":{"type":"string","enum":["EN","HU"]},"invitedTo":{"type":"string","enum":["whole","evening"]},"hotel":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"bus":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"notes":{"type":"string","maxLength":2000}},"required":["type","people","side","group","priority","email","phone","lang","invitedTo","hotel","bus","notes"]}},"required":["partyId","rsvpToken","party"]},"minItems":1,"maxItems":500}},"required":["type","parties"]},"Command_updateParty":{"title":"updateParty","description":"Guests: Replace an invitation’s details and people (replies and seats are kept).","type":"object","properties":{"type":{"const":"updateParty"},"partyId":{"type":"string","minLength":1,"maxLength":64},"party":{"type":"object","properties":{"type":{"type":"string","enum":["single","plus1","couple","family"]},"people":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64},"firstName":{"type":"string","maxLength":80},"lastName":{"type":"string","maxLength":80},"child":{"type":"boolean"},"diet":{"type":"string","maxLength":200},"dietTags":{"type":"array","items":{"type":"string","enum":["vegetarian","vegan","glutenfree","lactosefree","nutallergy","halal","kosher"]},"maxItems":7}},"required":["id","firstName","lastName","child","diet"]},"minItems":1,"maxItems":30},"side":{"type":"string","enum":["p1","p2","both"]},"group":{"type":"string","enum":["family","friends","university","work","neighbours"]},"priority":{"type":"string","enum":["must","maybe"]},"email":{"type":"string","maxLength":200},"phone":{"type":"string","maxLength":50},"lang":{"type":"string","enum":["EN","HU"]},"invitedTo":{"type":"string","enum":["whole","evening"]},"hotel":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"bus":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"notes":{"type":"string","maxLength":2000}},"required":["type","people","side","group","priority","email","phone","lang","invitedTo","hotel","bus","notes"]}},"required":["type","partyId","party"]},"Command_removeParties":{"title":"removeParties","description":"Guests: Remove invitations (and free their seats).","type":"object","properties":{"type":{"const":"removeParties"},"partyIds":{"type":"array","items":{"type":"string","minLength":1,"maxLength":64},"minItems":1,"maxItems":2000}},"required":["type","partyIds"]},"Command_setReply":{"title":"setReply","description":"Guests: Record an RSVP answer by hand: waiting, yes (with who is coming) or no, plus diets (free text and fixed `dietTags`), room and bus (null = not answered). Shown as \"Manually entered\".","type":"object","properties":{"type":{"const":"setReply"},"partyId":{"type":"string","minLength":1,"maxLength":64},"reply":{"type":"string","enum":["waiting","yes","no"]},"attendingPersonIds":{"type":"array","items":{"type":"string","minLength":1,"maxLength":64},"maxItems":30},"diets":{"type":"object","additionalProperties":{"type":"string","maxLength":200},"propertyNames":{"type":"string","minLength":1,"maxLength":64}},"dietTags":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string","enum":["vegetarian","vegan","glutenfree","lactosefree","nutallergy","halal","kosher"]},"maxItems":7},"propertyNames":{"type":"string","minLength":1,"maxLength":64}},"names":{"type":"object","additionalProperties":{"type":"object","properties":{"firstName":{"type":"string","maxLength":80},"lastName":{"type":"string","maxLength":80}},"required":["firstName","lastName"]},"propertyNames":{"type":"string","minLength":1,"maxLength":64}},"hotel":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"bus":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"required":["type","partyId","reply"]},"Command_setInvited":{"title":"setInvited","description":"Guests: Mark invitations as invited without e-mail (paper, WhatsApp): not-sent ones become \"waiting for a reply\" and use no free send. `invited: false` puts still-waiting ones back to \"not invited yet\".","type":"object","properties":{"type":{"const":"setInvited"},"partyIds":{"type":"array","items":{"type":"string","minLength":1,"maxLength":64},"minItems":1,"maxItems":2000},"invited":{"type":"boolean"}},"required":["type","partyIds","invited"]},"Command_newRsvpLink":{"title":"newRsvpLink","description":"Guests: Give an invitation a new personal RSVP link; the old link stops working. The server picks the new token (send any 16–64 characters; they are replaced).","type":"object","properties":{"type":{"const":"newRsvpLink"},"partyId":{"type":"string","minLength":1,"maxLength":64},"rsvpToken":{"type":"string","minLength":16,"maxLength":64}},"required":["type","partyId","rsvpToken"]},"Command_revertToGuestAnswer":{"title":"revertToGuestAnswer","description":"Guests: Put back the guest’s own last answer from the RSVP page over changes made by hand (NOTHING_TO_REVERT when the guest never answered online).","type":"object","properties":{"type":{"const":"revertToGuestAnswer"},"partyId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","partyId"]},"Command_updateRsvpSettings":{"title":"updateRsvpSettings","description":"Guests: RSVP form settings: ask dietary / accommodation / bus, PIN, message templates.","type":"object","properties":{"type":{"const":"updateRsvpSettings"},"patch":{"type":"object","properties":{"askDietary":{"type":"boolean"},"askAccommodation":{"type":"boolean"},"askBus":{"type":"boolean"},"pin":{"anyOf":[{"type":"string","pattern":"^\\d{4,8}$"},{"type":"null"}]},"emailTemplate":{"type":"string","maxLength":5000},"textTemplate":{"type":"string","maxLength":1000}}}},"required":["type","patch"]},"Command_setBusPickupPlace":{"title":"setBusPickupPlace","description":"Guests: Where the guest bus picks up.","type":"object","properties":{"type":{"const":"setBusPickupPlace"},"place":{"type":"string","maxLength":200}},"required":["type","place"]},"Command_seatParty":{"title":"seatParty","description":"Seating: Seat everyone of an invitation who has no seat yet at one table, from `seatIndex` on (all or nothing: NOT_ENOUGH_SEATS).","type":"object","properties":{"type":{"const":"seatParty"},"tableId":{"type":"string","minLength":1,"maxLength":64},"partyId":{"type":"string","minLength":1,"maxLength":64},"seatIndex":{"type":"integer","minimum":0}},"required":["type","tableId","partyId"]},"Command_addTable":{"title":"addTable","description":"Seating: Add a table (round, 8 seats; it appears on the floor plan).","type":"object","properties":{"type":{"const":"addTable"},"tableId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","tableId"]},"Command_updateTable":{"title":"updateTable","description":"Seating: Change a table: name, shape, capacity (2–24).","type":"object","properties":{"type":{"const":"updateTable"},"tableId":{"type":"string","minLength":1,"maxLength":64},"patch":{"type":"object","properties":{"name":{"type":"string","maxLength":80},"shape":{"type":"string","enum":["round","rect"]},"capacity":{"type":"integer"}}}},"required":["type","tableId","patch"]},"Command_removeTable":{"title":"removeTable","description":"Seating: Remove a table.","type":"object","properties":{"type":{"const":"removeTable"},"tableId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","tableId"]},"Command_seat":{"title":"seat","description":"Seating: Seat one person of an invitation on a given seat.","type":"object","properties":{"type":{"const":"seat"},"tableId":{"type":"string","minLength":1,"maxLength":64},"seatIndex":{"type":"integer","minimum":0},"partyId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","tableId","seatIndex","partyId"]},"Command_unseat":{"title":"unseat","description":"Seating: Free one seat.","type":"object","properties":{"type":{"const":"unseat"},"tableId":{"type":"string","minLength":1,"maxLength":64},"seatIndex":{"type":"integer","minimum":0}},"required":["type","tableId","seatIndex"]},"Command_seatFirstFree":{"title":"seatFirstFree","description":"Seating: Seat one person of an invitation on the first free seat of a table.","type":"object","properties":{"type":{"const":"seatFirstFree"},"tableId":{"type":"string","minLength":1,"maxLength":64},"partyId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","tableId","partyId"]},"Command_unseatOne":{"title":"unseatOne","description":"Seating: Free one seat of an invitation at a table.","type":"object","properties":{"type":{"const":"unseatOne"},"tableId":{"type":"string","minLength":1,"maxLength":64},"partyId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","tableId","partyId"]},"Command_applySeatingPreset":{"title":"applySeatingPreset","description":"Seating: Lay out a whole empty seat planner at once: \"round\" (round head table + rounds), \"banquet\" (long head table + long rows of 20–24) or \"mixed\" (long head table + rounds), sized for `guests` (default: the guest estimate or the yes count, whichever is larger), on the floor plan with the head table at the front. Table ids are `{presetId}-1`… and `{presetId}-h` (head). Refused once tables exist (TABLES_EXIST) or when the stored room is too small (ROOM_TOO_SMALL).","type":"object","properties":{"type":{"const":"applySeatingPreset"},"presetId":{"type":"string","minLength":1,"maxLength":48},"preset":{"type":"string","enum":["round","banquet","mixed"]},"size":{"type":"integer","minimum":4,"maximum":24},"guests":{"type":"integer","minimum":1,"maximum":1000},"lang":{"type":"string","enum":["EN","HU"]}},"required":["type","presetId","preset","size"]},"Command_addTablesLike":{"title":"addTablesLike","description":"Seating: Add tables with the same shape and capacity as an existing one, numbered after the last \"Table n\".","type":"object","properties":{"type":{"const":"addTablesLike"},"tableId":{"type":"string","minLength":1,"maxLength":64},"tableIds":{"type":"array","items":{"type":"string","minLength":1,"maxLength":64},"minItems":1,"maxItems":100},"lang":{"type":"string","enum":["EN","HU"]}},"required":["type","tableId","tableIds"]},"Command_removeTables":{"title":"removeTables","description":"Seating: Remove several tables at once (frees their seats). `restoreRoom` puts the room size back (undo of applySeatingPreset; null = the automatic room).","type":"object","properties":{"type":{"const":"removeTables"},"tableIds":{"type":"array","items":{"type":"string","minLength":1,"maxLength":64},"minItems":1,"maxItems":300},"restoreRoom":{"anyOf":[{"type":"object","properties":{"width":{"type":"number","minimum":5,"maximum":100},"length":{"type":"number","minimum":5,"maximum":100}},"required":["width","length"]},{"type":"null"}]}},"required":["type","tableIds"]},"Command_moveTable":{"title":"moveTable","description":"Seating: Place a table on the floor plan (centre, metres from the top-left corner).","type":"object","properties":{"type":{"const":"moveTable"},"tableId":{"type":"string","minLength":1,"maxLength":64},"x":{"type":"number","minimum":0,"maximum":100},"y":{"type":"number","minimum":0,"maximum":100}},"required":["type","tableId","x","y"]},"Command_rotateTable":{"title":"rotateTable","description":"Seating: Rotate a table on the floor plan (degrees).","type":"object","properties":{"type":{"const":"rotateTable"},"tableId":{"type":"string","minLength":1,"maxLength":64},"rotation":{"type":"integer","minimum":0,"maximum":359}},"required":["type","tableId","rotation"]},"Command_setFloorSize":{"title":"setFloorSize","description":"Seating: Set the room size (metres).","type":"object","properties":{"type":{"const":"setFloorSize"},"width":{"type":"number","minimum":5,"maximum":100},"length":{"type":"number","minimum":5,"maximum":100}},"required":["type","width","length"]},"Command_addFloorElement":{"title":"addFloorElement","description":"Seating: Add a dance floor, stage, bar, buffet… to the floor plan.","type":"object","properties":{"type":{"const":"addFloorElement"},"elementId":{"type":"string","minLength":1,"maxLength":64},"kind":{"type":"string","enum":["dancefloor","stage","bar","buffet","cake","photobooth","entrance","dj","gifts","custom"]},"label":{"type":"string","maxLength":40},"x":{"type":"number","minimum":0,"maximum":100},"y":{"type":"number","minimum":0,"maximum":100},"w":{"type":"number","minimum":0.3,"maximum":50},"h":{"type":"number","minimum":0.3,"maximum":50},"rotation":{"type":"integer","minimum":0,"maximum":359}},"required":["type","elementId","kind"]},"Command_updateFloorElement":{"title":"updateFloorElement","description":"Seating: Move, resize, rotate or rename a floor plan element.","type":"object","properties":{"type":{"const":"updateFloorElement"},"elementId":{"type":"string","minLength":1,"maxLength":64},"patch":{"type":"object","properties":{"label":{"type":"string","maxLength":40},"x":{"type":"number","minimum":0,"maximum":100},"y":{"type":"number","minimum":0,"maximum":100},"w":{"type":"number","minimum":0.3,"maximum":50},"h":{"type":"number","minimum":0.3,"maximum":50},"rotation":{"type":"integer","minimum":0,"maximum":359}}}},"required":["type","elementId","patch"]},"Command_removeFloorElement":{"title":"removeFloorElement","description":"Seating: Remove a floor plan element.","type":"object","properties":{"type":{"const":"removeFloorElement"},"elementId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","elementId"]},"Command_createVersion":{"title":"createVersion","description":"Big Day: Copy a day version into a new alternative day (Premium).","type":"object","properties":{"type":{"const":"createVersion"},"versionId":{"type":"string","minLength":1,"maxLength":64},"name":{"type":"string","maxLength":80},"sourceVersionId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","versionId","name","sourceVersionId"]},"Command_renameVersion":{"title":"renameVersion","description":"Big Day: Rename a day version.","type":"object","properties":{"type":{"const":"renameVersion"},"versionId":{"type":"string","minLength":1,"maxLength":64},"name":{"type":"string","maxLength":80}},"required":["type","versionId","name"]},"Command_removeVersion":{"title":"removeVersion","description":"Big Day: Remove an alternative day version.","type":"object","properties":{"type":{"const":"removeVersion"},"versionId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","versionId"]},"Command_restoreVersion":{"title":"restoreVersion","description":"Big Day: Put a removed version back (undo; Premium).","type":"object","properties":{"type":{"const":"restoreVersion"},"version":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64},"name":{"type":"string","maxLength":80},"isPlan":{"const":false},"moments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64},"time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"name":{"type":"string","maxLength":120},"lane":{"type":"string","enum":["stage","back"]},"icon":{"type":"string","enum":["ceremony","glass","dinner","music","moon","spark","brush","key","flower","camera","box","car","cake","ring","bus","people","party"]},"link":{"anyOf":[{"type":"object","properties":{"type":{"const":"none"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"vendor"},"itemId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","itemId"]}]},"durationMin":{"type":"integer"},"oldPick":{"type":"object","properties":{"optionId":{"type":"string","minLength":1,"maxLength":64},"name":{"type":"string","maxLength":200}},"required":["optionId","name"]}},"required":["id","time","name","lane","icon","link","durationMin"]},"maxItems":200},"picks":{"type":"object","additionalProperties":{"anyOf":[{"type":"string","minLength":1,"maxLength":64},{"type":"null"}]},"propertyNames":{"type":"string","minLength":1,"maxLength":64}}},"required":["id","name","isPlan","moments","picks"]},"index":{"type":"integer","minimum":0,"maximum":10000}},"required":["type","version","index"]},"Command_makePlan":{"title":"makePlan","description":"Big Day: Make an alternative day the plan.","type":"object","properties":{"type":{"const":"makePlan"},"versionId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","versionId"]},"Command_useOptionInPlan":{"title":"useOptionInPlan","description":"Big Day: Use an option of a vendor in the plan.","type":"object","properties":{"type":{"const":"useOptionInPlan"},"itemId":{"type":"string","minLength":1,"maxLength":64},"optionId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","itemId","optionId"]},"Command_useMomentInPlan":{"title":"useMomentInPlan","description":"Big Day: Copy a moment from an alternative day into the plan.","type":"object","properties":{"type":{"const":"useMomentInPlan"},"versionId":{"type":"string","minLength":1,"maxLength":64},"momentId":{"type":"string","minLength":1,"maxLength":64},"newMomentId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","versionId","momentId","newMomentId"]},"Command_addMoment":{"title":"addMoment","description":"Big Day: Add a moment (time, name, lane, icon) to a day version; the plan is the version with isPlan = true.","type":"object","properties":{"type":{"const":"addMoment"},"versionId":{"type":"string","minLength":1,"maxLength":64},"moment":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64},"time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"name":{"type":"string","maxLength":120},"lane":{"type":"string","enum":["stage","back"]},"icon":{"type":"string","enum":["ceremony","glass","dinner","music","moon","spark","brush","key","flower","camera","box","car","cake","ring","bus","people","party"]},"link":{"anyOf":[{"type":"object","properties":{"type":{"const":"none"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"vendor"},"itemId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","itemId"]}]}},"required":["id","time","name","lane","icon","link"]}},"required":["type","versionId","moment"]},"Command_updateMoment":{"title":"updateMoment","description":"Big Day: Change a moment: name, time, lane, icon, duration; oldPick null dismisses the \"in your old plan this moment used…\" note a migrated plan may carry.","type":"object","properties":{"type":{"const":"updateMoment"},"versionId":{"type":"string","minLength":1,"maxLength":64},"momentId":{"type":"string","minLength":1,"maxLength":64},"patch":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"time":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"lane":{"type":"string","enum":["stage","back"]},"icon":{"type":"string","enum":["ceremony","glass","dinner","music","moon","spark","brush","key","flower","camera","box","car","cake","ring","bus","people","party"]},"durationMin":{"type":"integer"},"oldPick":{"anyOf":[{"type":"object","properties":{"optionId":{"type":"string","minLength":1,"maxLength":64},"name":{"type":"string","maxLength":200}},"required":["optionId","name"]},{"type":"null"}]}}}},"required":["type","versionId","momentId","patch"]},"Command_moveMoment":{"title":"moveMoment","description":"Big Day: Move a moment to a lane and a time slot.","type":"object","properties":{"type":{"const":"moveMoment"},"versionId":{"type":"string","minLength":1,"maxLength":64},"momentId":{"type":"string","minLength":1,"maxLength":64},"lane":{"type":"string","enum":["stage","back"]},"slot":{"type":"integer","minimum":0,"maximum":2160}},"required":["type","versionId","momentId","lane","slot"]},"Command_linkMoment":{"title":"linkMoment","description":"Big Day: Link a moment to a vendor item (null unlinks).","type":"object","properties":{"type":{"const":"linkMoment"},"versionId":{"type":"string","minLength":1,"maxLength":64},"momentId":{"type":"string","minLength":1,"maxLength":64},"itemId":{"anyOf":[{"type":"string","minLength":1,"maxLength":64},{"type":"null"}]}},"required":["type","versionId","momentId","itemId"]},"Command_createItemForMoment":{"title":"createItemForMoment","description":"Big Day: Create a vendor item for a moment and link it.","type":"object","properties":{"type":{"const":"createItemForMoment"},"versionId":{"type":"string","minLength":1,"maxLength":64},"momentId":{"type":"string","minLength":1,"maxLength":64},"itemId":{"type":"string","minLength":1,"maxLength":64},"name":{"type":"string","maxLength":120,"minLength":1},"category":{"type":"string","enum":["place","food","ceremony","music","media","look","attire","logistics"]}},"required":["type","versionId","momentId","itemId","name","category"]},"Command_setMomentOption":{"title":"setMomentOption","description":"Big Day: Alternative days: pick which option a linked vendor uses.","type":"object","properties":{"type":{"const":"setMomentOption"},"versionId":{"type":"string","minLength":1,"maxLength":64},"momentId":{"type":"string","minLength":1,"maxLength":64},"optionId":{"anyOf":[{"type":"string","minLength":1,"maxLength":64},{"type":"null"}]},"followPlan":{"type":"boolean"}},"required":["type","versionId","momentId","optionId"]},"Command_addOptionForMoment":{"title":"addOptionForMoment","description":"Big Day: Add an option to the vendor linked to a moment.","type":"object","properties":{"type":{"const":"addOptionForMoment"},"versionId":{"type":"string","minLength":1,"maxLength":64},"momentId":{"type":"string","minLength":1,"maxLength":64},"optionId":{"type":"string","minLength":1,"maxLength":64},"name":{"type":"string","maxLength":200},"amount":{"type":"integer","minimum":0,"maximum":10000000000}},"required":["type","versionId","momentId","optionId","name","amount"]},"Command_setMomentItemStatus":{"title":"setMomentItemStatus","description":"Big Day: Set the status of the vendor linked to a moment.","type":"object","properties":{"type":{"const":"setMomentItemStatus"},"versionId":{"type":"string","minLength":1,"maxLength":64},"momentId":{"type":"string","minLength":1,"maxLength":64},"status":{"type":"string","enum":["idea","comparing","booked","done"]}},"required":["type","versionId","momentId","status"]},"Command_duplicateMoment":{"title":"duplicateMoment","description":"Big Day: Duplicate a moment.","type":"object","properties":{"type":{"const":"duplicateMoment"},"versionId":{"type":"string","minLength":1,"maxLength":64},"momentId":{"type":"string","minLength":1,"maxLength":64},"newMomentId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","versionId","momentId","newMomentId"]},"Command_removeMoment":{"title":"removeMoment","description":"Big Day: Remove a moment.","type":"object","properties":{"type":{"const":"removeMoment"},"versionId":{"type":"string","minLength":1,"maxLength":64},"momentId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","versionId","momentId"]},"Command_addItemToDay":{"title":"addItemToDay","description":"Big Day: Put a vendor item on the plan as a moment.","type":"object","properties":{"type":{"const":"addItemToDay"},"itemId":{"type":"string","minLength":1,"maxLength":64},"momentId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","itemId","momentId"]},"Command_setTemplate":{"title":"setTemplate","description":"Studio: Choose the design template (0 blush, 1 midnight, 2 industrial, 3 garden, 4 golden hour).","type":"object","properties":{"type":{"const":"setTemplate"},"templateIndex":{"type":"integer","minimum":0,"maximum":4}},"required":["type","templateIndex"]},"Command_setAccent":{"title":"setAccent","description":"Studio: Set the couple’s own accent colour (#rrggbb) for the website and printables; null = the template’s.","type":"object","properties":{"type":{"const":"setAccent"},"accent":{"anyOf":[{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},{"type":"null"}]}},"required":["type","accent"]},"Command_newSiteLink":{"title":"newSiteLink","description":"Studio: Give the wedding website a new public link; the old link stops working. The server picks the new slug.","type":"object","properties":{"type":{"const":"newSiteLink"},"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{7,63}$"}},"required":["type","slug"]},"Command_setSiteSection":{"title":"setSiteSection","description":"Studio: Show / hide a section of the wedding website.","type":"object","properties":{"type":{"const":"setSiteSection"},"key":{"type":"string","enum":["cover","welcome","countdown","day","location","travel","stay","dress","story","gallery","rsvp"]},"on":{"type":"boolean"}},"required":["type","key","on"]},"Command_moveSiteSection":{"title":"moveSiteSection","description":"Studio: Move a website section up or down.","type":"object","properties":{"type":{"const":"moveSiteSection"},"key":{"type":"string","enum":["cover","welcome","countdown","day","location","travel","stay","dress","story","gallery","rsvp"]},"dir":{"anyOf":[{"const":-1},{"const":1}]}},"required":["type","key","dir"]},"Command_setSitePublished":{"title":"setSitePublished","description":"Studio: Publish / unpublish the wedding website (publishing needs Premium).","type":"object","properties":{"type":{"const":"setSitePublished"},"published":{"type":"boolean"}},"required":["type","published"]},"Command_updateSite":{"title":"updateSite","description":"Studio: Change website texts: guest language, welcome, story, dress code, venue name and address, getting there (travelText), where to stay (stayText), RSVP deadline and RSVP note, vendor names on the day timeline (showVendors), search-engine visibility (indexable).","type":"object","properties":{"type":{"const":"updateSite"},"patch":{"type":"object","properties":{"guestLanguage":{"type":"string","enum":["en","hu"]},"welcomeText":{"type":"string","maxLength":2000},"storyText":{"type":"string","maxLength":5000},"dressCode":{"type":"string","maxLength":300},"venueDisplayName":{"type":"string","maxLength":200},"venueAddress":{"type":"string","maxLength":300},"rsvpDeadline":{"anyOf":[{"const":""},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"travelText":{"type":"string","maxLength":2000},"stayText":{"type":"string","maxLength":2000},"rsvpNote":{"type":"string","maxLength":1000},"showVendors":{"type":"boolean"},"indexable":{"type":"boolean"}}}},"required":["type","patch"]},"Command_updatePhoto":{"title":"updatePhoto","description":"Studio: Rename a photo.","type":"object","properties":{"type":{"const":"updatePhoto"},"photoId":{"type":"string","minLength":1,"maxLength":64},"label":{"type":"string","maxLength":200}},"required":["type","photoId","label"]},"Command_removePhoto":{"title":"removePhoto","description":"Studio: Remove a photo.","type":"object","properties":{"type":{"const":"removePhoto"},"photoId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","photoId"]},"Command_setDesignStatus":{"title":"setDesignStatus","description":"Studio: Set a design’s status: not started, draft, done.","type":"object","properties":{"type":{"const":"setDesignStatus"},"key":{"type":"string","enum":["site","savethedate","invitations","seating","menu","namecards","tablenumbers","welcome","order","thankyou"]},"status":{"type":"string","enum":["notStarted","draft","done"]}},"required":["type","key","status"]},"Command_setDesignText":{"title":"setDesignText","description":"Studio: Override a text block of a design (null = follow the planner again).","type":"object","properties":{"type":{"const":"setDesignText"},"key":{"type":"string","enum":["site","savethedate","invitations","seating","menu","namecards","tablenumbers","welcome","order","thankyou"]},"block":{"type":"string","minLength":1,"maxLength":40},"text":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}]}},"required":["type","key","block","text"]},"Command_setDesignPhotos":{"title":"setDesignPhotos","description":"Studio: Set the photos of a design slot, in order.","type":"object","properties":{"type":{"const":"setDesignPhotos"},"key":{"type":"string","enum":["site","savethedate","invitations","seating","menu","namecards","tablenumbers","welcome","order","thankyou"]},"slot":{"type":"string","minLength":1,"maxLength":40},"photoIds":{"type":"array","items":{"type":"string","minLength":1,"maxLength":64},"maxItems":100}},"required":["type","key","slot","photoIds"]},"Command_setDesignStyle":{"title":"setDesignStyle","description":"Studio: Design style: show photo, alignment, paper size, include guests who haven't replied (seating chart, name cards; on unless false), print cards for people without a name (name cards), landscape orientation (every printable with a paper choice), a QR code to the published website (save-the-date, invitation).","type":"object","properties":{"type":{"const":"setDesignStyle"},"key":{"type":"string","enum":["site","savethedate","invitations","seating","menu","namecards","tablenumbers","welcome","order","thankyou"]},"patch":{"type":"object","properties":{"showPhoto":{"type":"boolean"},"align":{"type":"string","enum":["center","left"]},"paper":{"type":"string","enum":["A1","A2","A3","A4","A5","A6","DL","square","5x7"]},"includeUnreplied":{"type":"boolean"},"printUnnamed":{"type":"boolean"},"orientation":{"type":"string","enum":["portrait","landscape"]},"showQr":{"type":"boolean"}}}},"required":["type","key","patch"]},"Command_addMenuSection":{"title":"addMenuSection","description":"Menu: Add a section to the table menu (Starters, Main course…).","type":"object","properties":{"type":{"const":"addMenuSection"},"sectionId":{"type":"string","minLength":1,"maxLength":64},"title":{"type":"string","maxLength":80},"index":{"type":"integer","minimum":0,"maximum":1000}},"required":["type","sectionId","title"]},"Command_renameMenuSection":{"title":"renameMenuSection","description":"Menu: Rename a menu section.","type":"object","properties":{"type":{"const":"renameMenuSection"},"sectionId":{"type":"string","minLength":1,"maxLength":64},"title":{"type":"string","maxLength":80}},"required":["type","sectionId","title"]},"Command_moveMenuSection":{"title":"moveMenuSection","description":"Menu: Move a menu section up or down.","type":"object","properties":{"type":{"const":"moveMenuSection"},"sectionId":{"type":"string","minLength":1,"maxLength":64},"dir":{"anyOf":[{"const":-1},{"const":1}]}},"required":["type","sectionId","dir"]},"Command_removeMenuSection":{"title":"removeMenuSection","description":"Menu: Remove a menu section.","type":"object","properties":{"type":{"const":"removeMenuSection"},"sectionId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","sectionId"]},"Command_restoreMenuSection":{"title":"restoreMenuSection","description":"Menu: Put a removed menu section back (undo).","type":"object","properties":{"type":{"const":"restoreMenuSection"},"section":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64},"title":{"type":"string","maxLength":80},"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64},"name":{"type":"string","maxLength":200},"note":{"type":"string","maxLength":300}},"required":["id","name"]},"maxItems":30}},"required":["id","title","items"]},"index":{"type":"integer","minimum":0,"maximum":1000}},"required":["type","section","index"]},"Command_addMenuItem":{"title":"addMenuItem","description":"Menu: Add a dish or drink to a menu section.","type":"object","properties":{"type":{"const":"addMenuItem"},"sectionId":{"type":"string","minLength":1,"maxLength":64},"itemId":{"type":"string","minLength":1,"maxLength":64},"name":{"type":"string","maxLength":200},"note":{"type":"string","maxLength":300}},"required":["type","sectionId","itemId","name"]},"Command_updateMenuItem":{"title":"updateMenuItem","description":"Menu: Change a dish: name, note.","type":"object","properties":{"type":{"const":"updateMenuItem"},"sectionId":{"type":"string","minLength":1,"maxLength":64},"itemId":{"type":"string","minLength":1,"maxLength":64},"patch":{"type":"object","properties":{"name":{"type":"string","maxLength":200},"note":{"type":"string","maxLength":300}}}},"required":["type","sectionId","itemId","patch"]},"Command_moveMenuItem":{"title":"moveMenuItem","description":"Menu: Move a dish up or down.","type":"object","properties":{"type":{"const":"moveMenuItem"},"sectionId":{"type":"string","minLength":1,"maxLength":64},"itemId":{"type":"string","minLength":1,"maxLength":64},"dir":{"anyOf":[{"const":-1},{"const":1}]}},"required":["type","sectionId","itemId","dir"]},"Command_removeMenuItem":{"title":"removeMenuItem","description":"Menu: Remove a dish.","type":"object","properties":{"type":{"const":"removeMenuItem"},"sectionId":{"type":"string","minLength":1,"maxLength":64},"itemId":{"type":"string","minLength":1,"maxLength":64}},"required":["type","sectionId","itemId"]},"Command_restoreMenuItem":{"title":"restoreMenuItem","description":"Menu: Put a removed dish back (undo).","type":"object","properties":{"type":{"const":"restoreMenuItem"},"sectionId":{"type":"string","minLength":1,"maxLength":64},"item":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64},"name":{"type":"string","maxLength":200},"note":{"type":"string","maxLength":300}},"required":["id","name"]},"index":{"type":"integer","minimum":0,"maximum":1000}},"required":["type","sectionId","item","index"]}}}}