@wix/agent-skills 1.16.3 → 1.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/package.json +1 -1
  2. package/skills/wix-app/SKILL.md +115 -12
  3. package/skills/wix-app/references/APP_MARKET_REVIEW.md +1 -1
  4. package/skills/wix-app/references/BACKEND_API.md +18 -0
  5. package/skills/wix-app/references/CUSTOM_ELEMENT_WIDGET.md +6 -0
  6. package/skills/wix-app/references/DASHBOARD_MODAL.md +10 -2
  7. package/skills/wix-app/references/DASHBOARD_PAGE.md +32 -70
  8. package/skills/wix-app/references/EDITOR_REACT_COMPONENT.md +145 -127
  9. package/skills/wix-app/references/SITE_PLUGIN.md +14 -2
  10. package/skills/wix-app/references/WIX_PATTERNS_DOCS.md +74 -68
  11. package/skills/wix-app/references/backend-event/COMMON-EVENTS.md +2 -2
  12. package/skills/wix-app/references/dashboard-page/COLLECTION_TOOLKIT.md +79 -0
  13. package/skills/wix-app/references/dashboard-page/ENTITY_PAGE_TOOLKIT.md +73 -0
  14. package/skills/wix-app/references/dashboard-page/PATTERNS_BUNDLE_READING.md +52 -0
  15. package/skills/wix-app/references/dashboard-page/UX_SUCCESS_MODEL.md +184 -0
  16. package/skills/wix-app/references/editor-react-component/ACCESSIBILITY.md +182 -99
  17. package/skills/wix-app/references/editor-react-component/ANIMATED-COMPONENTS.md +94 -49
  18. package/skills/wix-app/references/editor-react-component/BRANDED-COMPONENTS.md +16 -6
  19. package/skills/wix-app/references/editor-react-component/BROWSER-SUPPORT.md +56 -0
  20. package/skills/wix-app/references/editor-react-component/COMPONENT-CONTRACT.md +275 -0
  21. package/skills/wix-app/references/editor-react-component/COMPONENT-PREVIEW.md +35 -40
  22. package/skills/wix-app/references/editor-react-component/CSS-GUIDELINES.md +167 -445
  23. package/skills/wix-app/references/editor-react-component/DESIGN-STATES.md +56 -29
  24. package/skills/wix-app/references/editor-react-component/DIRECTIONALITY.md +53 -158
  25. package/skills/wix-app/references/editor-react-component/EDITOR-EXTENSION-CONFIGURATION.md +78 -0
  26. package/skills/wix-app/references/editor-react-component/FUNCTION-HANDLERS.md +42 -134
  27. package/skills/wix-app/references/editor-react-component/MANIFEST-ERRORS.md +11 -3
  28. package/skills/wix-app/references/editor-react-component/PARTS.md +46 -24
  29. package/skills/wix-app/references/editor-react-component/PROPS-VS-CSS.md +63 -179
  30. package/skills/wix-app/references/editor-react-component/REACT-GUIDELINES.md +79 -163
  31. package/skills/wix-app/references/editor-react-component/SITE-CONTEXT-HOOKS.md +36 -21
  32. package/skills/wix-app/references/editor-react-component/SSR.md +30 -99
  33. package/skills/wix-base44-connector/SKILL.md +156 -50
  34. package/skills/wix-base44-connector/references/CAPABILITY_MAP.md +78 -0
  35. package/skills/wix-base44-connector/scripts/utils.js +239 -45
  36. package/skills/wix-headless/entry/bootstrap.mjs +9 -2
  37. package/skills/wix-headless/entry/skill.md +1 -1
  38. package/skills/wix-headless/references/CAPABILITIES.md +9 -1
  39. package/skills/wix-headless/references/DESIGN.md +1 -0
  40. package/skills/wix-headless/references/DISCOVERY.md +2 -1
  41. package/skills/wix-headless/references/IMAGE_GENERATION.md +1 -0
  42. package/skills/wix-headless/references/SDK_HANDOFF.md +5 -2
  43. package/skills/wix-headless/references/SEED.md +2 -1
  44. package/skills/wix-headless/references/SETUP.md +1 -0
  45. package/skills/wix-headless/references/inline-recipes/how-to-code-a-blog.md +2 -2
  46. package/skills/wix-headless/references/inline-recipes/how-to-code-a-store.md +68 -31
  47. package/skills/wix-headless/references/inline-recipes/how-to-code-forms.md +26 -10
  48. package/skills/wix-headless/references/inline-recipes/how-to-code-members-astro.md +8 -8
  49. package/skills/wix-headless/references/inline-recipes/how-to-code-members-custom-login.md +1 -1
  50. package/skills/wix-headless/references/inline-recipes/how-to-code-members-non-astro.md +1 -1
  51. package/skills/wix-headless/references/inline-recipes/how-to-code-pricing-plans.md +10 -8
  52. package/skills/wix-headless/references/inline-recipes/how-to-code-rentals.md +254 -0
  53. package/skills/wix-headless/references/inline-recipes/how-to-code-restaurant-orders.md +27 -24
  54. package/skills/wix-headless/references/inline-recipes/setup-online-store.md +13 -0
  55. package/skills/wix-headless/references/inline-recipes/setup-rentals.md +254 -0
  56. package/skills/wix-headless/references/managed/AUTHENTICATION.md +5 -0
  57. package/skills/wix-headless/references/non-astro.md +1 -1
  58. package/skills/wix-headless-fast/SKILL.md +166 -0
  59. package/skills/wix-headless-fast/entry/skill.md +99 -0
  60. package/skills/wix-headless-fast/install/deploy.mjs +433 -0
  61. package/skills/wix-headless-fast/install/fast-path.mjs +141 -0
  62. package/skills/wix-headless-fast/references/blog/INSTRUCTIONS.md +137 -0
  63. package/skills/wix-headless-fast/references/blog/app/components/blog/BlogFeedView.tsx +137 -0
  64. package/skills/wix-headless-fast/references/blog/app/components/blog/PostView.tsx +113 -0
  65. package/skills/wix-headless-fast/references/blog/app/components/blog/RichContent.tsx +42 -0
  66. package/skills/wix-headless-fast/references/blog/app/hooks/blog/useBlogFeed.ts +123 -0
  67. package/skills/wix-headless-fast/references/blog/app/hooks/blog/usePost.ts +70 -0
  68. package/skills/wix-headless-fast/references/blog/app/wix/blog/posts.ts +99 -0
  69. package/skills/wix-headless-fast/references/blog/app/wix/blog/taxonomy.ts +76 -0
  70. package/skills/wix-headless-fast/references/blog/app/wix/blog/types.ts +62 -0
  71. package/skills/wix-headless-fast/references/blog/app-astro/layouts/SiteLayout.astro +40 -0
  72. package/skills/wix-headless-fast/references/blog/app-astro/pages/blog/[...slug].astro +99 -0
  73. package/skills/wix-headless-fast/references/blog/app-astro/pages/blog.astro +24 -0
  74. package/skills/wix-headless-fast/references/blog/lock/astro/package-lock.json +16156 -0
  75. package/skills/wix-headless-fast/references/blog/seed/SEED.md +72 -0
  76. package/skills/wix-headless-fast/references/blog/seed/seed-blog.mjs +287 -0
  77. package/skills/wix-headless-fast/references/bookings/INSTRUCTIONS.md +129 -0
  78. package/skills/wix-headless-fast/references/bookings/app/components/bookings/ServiceBookingView.tsx +143 -0
  79. package/skills/wix-headless-fast/references/bookings/app/components/bookings/ServicesView.tsx +119 -0
  80. package/skills/wix-headless-fast/references/bookings/app/hooks/bookings/useBookingFlow.ts +138 -0
  81. package/skills/wix-headless-fast/references/bookings/app/hooks/bookings/useServices.ts +54 -0
  82. package/skills/wix-headless-fast/references/bookings/app/wix/bookings/booking.ts +206 -0
  83. package/skills/wix-headless-fast/references/bookings/app/wix/bookings/services.ts +96 -0
  84. package/skills/wix-headless-fast/references/bookings/app/wix/bookings/types.ts +70 -0
  85. package/skills/wix-headless-fast/references/bookings/app-astro/layouts/SiteLayout.astro +40 -0
  86. package/skills/wix-headless-fast/references/bookings/app-astro/pages/services/[slug].astro +76 -0
  87. package/skills/wix-headless-fast/references/bookings/app-astro/pages/services.astro +22 -0
  88. package/skills/wix-headless-fast/references/bookings/lock/astro/package-lock.json +11962 -0
  89. package/skills/wix-headless-fast/references/bookings/seed/SEED.md +61 -0
  90. package/skills/wix-headless-fast/references/bookings/seed/seed-bookings.mjs +302 -0
  91. package/skills/wix-headless-fast/references/cms/INSTRUCTIONS.md +179 -0
  92. package/skills/wix-headless-fast/references/cms/app/hooks/cms/useCollection.ts +83 -0
  93. package/skills/wix-headless-fast/references/cms/app/hooks/cms/useItem.ts +57 -0
  94. package/skills/wix-headless-fast/references/cms/app/wix/cms/items.ts +151 -0
  95. package/skills/wix-headless-fast/references/cms/app/wix/cms/types.ts +75 -0
  96. package/skills/wix-headless-fast/references/cms/app-astro/layouts/SiteLayout.astro +41 -0
  97. package/skills/wix-headless-fast/references/cms/lock/astro/package-lock.json +11262 -0
  98. package/skills/wix-headless-fast/references/cms/seed/SEED.md +103 -0
  99. package/skills/wix-headless-fast/references/cms/seed/seed-cms.mjs +324 -0
  100. package/skills/wix-headless-fast/references/events/INSTRUCTIONS.md +149 -0
  101. package/skills/wix-headless-fast/references/events/app/components/events/EventConfirmationView.tsx +66 -0
  102. package/skills/wix-headless-fast/references/events/app/components/events/EventRegistrationView.tsx +176 -0
  103. package/skills/wix-headless-fast/references/events/app/components/events/EventsView.tsx +118 -0
  104. package/skills/wix-headless-fast/references/events/app/hooks/events/useEventRegistration.ts +117 -0
  105. package/skills/wix-headless-fast/references/events/app/hooks/events/useEvents.ts +59 -0
  106. package/skills/wix-headless-fast/references/events/app/wix/events/events.ts +136 -0
  107. package/skills/wix-headless-fast/references/events/app/wix/events/registration.ts +128 -0
  108. package/skills/wix-headless-fast/references/events/app/wix/events/types.ts +61 -0
  109. package/skills/wix-headless-fast/references/events/app-astro/layouts/SiteLayout.astro +40 -0
  110. package/skills/wix-headless-fast/references/events/app-astro/pages/event-confirmation.astro +12 -0
  111. package/skills/wix-headless-fast/references/events/app-astro/pages/events/[slug].astro +80 -0
  112. package/skills/wix-headless-fast/references/events/app-astro/pages/events.astro +21 -0
  113. package/skills/wix-headless-fast/references/events/lock/astro/package-lock.json +11884 -0
  114. package/skills/wix-headless-fast/references/events/seed/SEED.md +86 -0
  115. package/skills/wix-headless-fast/references/events/seed/seed-events.mjs +276 -0
  116. package/skills/wix-headless-fast/references/forms/INSTRUCTIONS.md +150 -0
  117. package/skills/wix-headless-fast/references/forms/app/hooks/forms/useWixForm.ts +317 -0
  118. package/skills/wix-headless-fast/references/forms/app/wix/forms/forms.ts +269 -0
  119. package/skills/wix-headless-fast/references/forms/app/wix/forms/submissions.ts +231 -0
  120. package/skills/wix-headless-fast/references/forms/app/wix/forms/types.ts +135 -0
  121. package/skills/wix-headless-fast/references/forms/lock/astro/package-lock.json +10593 -0
  122. package/skills/wix-headless-fast/references/forms/seed/SEED.md +108 -0
  123. package/skills/wix-headless-fast/references/forms/seed/seed-forms.mjs +320 -0
  124. package/skills/wix-headless-fast/references/members/INSTRUCTIONS.md +63 -0
  125. package/skills/wix-headless-fast/references/members/app/components/members/AccountView.tsx +60 -0
  126. package/skills/wix-headless-fast/references/members/app/components/members/LoginForm.tsx +155 -0
  127. package/skills/wix-headless-fast/references/members/app/components/members/MemberMenu.tsx +78 -0
  128. package/skills/wix-headless-fast/references/members/app/components/members/RequireAuth.tsx +47 -0
  129. package/skills/wix-headless-fast/references/members/app/hooks/members/useMember.ts +66 -0
  130. package/skills/wix-headless-fast/references/members/app/wix/members/auth.ts +88 -0
  131. package/skills/wix-headless-fast/references/members/app/wix/members/client.ts +53 -0
  132. package/skills/wix-headless-fast/references/members/app/wix/members/member-store.ts +122 -0
  133. package/skills/wix-headless-fast/references/members/app/wix/members/members.ts +50 -0
  134. package/skills/wix-headless-fast/references/members/app/wix/members/types.ts +21 -0
  135. package/skills/wix-headless-fast/references/members/app-astro/layouts/SiteLayout.astro +42 -0
  136. package/skills/wix-headless-fast/references/members/app-astro/pages/account.astro +10 -0
  137. package/skills/wix-headless-fast/references/members/app-astro/pages/login.astro +11 -0
  138. package/skills/wix-headless-fast/references/members/lock/astro/package-lock.json +10329 -0
  139. package/skills/wix-headless-fast/references/members/seed/SEED.md +39 -0
  140. package/skills/wix-headless-fast/references/members/seed/seed-members.mjs +94 -0
  141. package/skills/wix-headless-fast/references/portfolio/INSTRUCTIONS.md +134 -0
  142. package/skills/wix-headless-fast/references/portfolio/app/components/portfolio/CollectionProjectsView.tsx +110 -0
  143. package/skills/wix-headless-fast/references/portfolio/app/components/portfolio/CollectionsView.tsx +90 -0
  144. package/skills/wix-headless-fast/references/portfolio/app/components/portfolio/ProjectDetailView.tsx +115 -0
  145. package/skills/wix-headless-fast/references/portfolio/app/hooks/portfolio/useCollectionProjects.ts +59 -0
  146. package/skills/wix-headless-fast/references/portfolio/app/hooks/portfolio/useCollections.ts +39 -0
  147. package/skills/wix-headless-fast/references/portfolio/app/hooks/portfolio/useProjectDetail.ts +58 -0
  148. package/skills/wix-headless-fast/references/portfolio/app/wix/portfolio/portfolio.ts +165 -0
  149. package/skills/wix-headless-fast/references/portfolio/app/wix/portfolio/types.ts +55 -0
  150. package/skills/wix-headless-fast/references/portfolio/app-astro/layouts/SiteLayout.astro +40 -0
  151. package/skills/wix-headless-fast/references/portfolio/app-astro/pages/portfolio/[slug].astro +30 -0
  152. package/skills/wix-headless-fast/references/portfolio/app-astro/pages/portfolio.astro +21 -0
  153. package/skills/wix-headless-fast/references/portfolio/app-astro/pages/projects/[slug].astro +29 -0
  154. package/skills/wix-headless-fast/references/portfolio/lock/astro/package-lock.json +10197 -0
  155. package/skills/wix-headless-fast/references/portfolio/seed/SEED.md +78 -0
  156. package/skills/wix-headless-fast/references/portfolio/seed/seed-portfolio.mjs +258 -0
  157. package/skills/wix-headless-fast/references/pricing-plans/INSTRUCTIONS.md +133 -0
  158. package/skills/wix-headless-fast/references/pricing-plans/app/components/pricing-plans/PlanDetailView.tsx +58 -0
  159. package/skills/wix-headless-fast/references/pricing-plans/app/components/pricing-plans/PlansView.tsx +126 -0
  160. package/skills/wix-headless-fast/references/pricing-plans/app/hooks/pricing-plans/usePlanPurchase.ts +37 -0
  161. package/skills/wix-headless-fast/references/pricing-plans/app/hooks/pricing-plans/usePlans.ts +39 -0
  162. package/skills/wix-headless-fast/references/pricing-plans/app/wix/pricing-plans/plans.ts +75 -0
  163. package/skills/wix-headless-fast/references/pricing-plans/app/wix/pricing-plans/purchase.ts +45 -0
  164. package/skills/wix-headless-fast/references/pricing-plans/app/wix/pricing-plans/types.ts +30 -0
  165. package/skills/wix-headless-fast/references/pricing-plans/app-astro/layouts/SiteLayout.astro +41 -0
  166. package/skills/wix-headless-fast/references/pricing-plans/app-astro/pages/plans/[slug].astro +40 -0
  167. package/skills/wix-headless-fast/references/pricing-plans/app-astro/pages/plans.astro +21 -0
  168. package/skills/wix-headless-fast/references/pricing-plans/lock/astro/package-lock.json +11226 -0
  169. package/skills/wix-headless-fast/references/pricing-plans/seed/SEED.md +71 -0
  170. package/skills/wix-headless-fast/references/pricing-plans/seed/seed-pricing-plans.mjs +279 -0
  171. package/skills/wix-headless-fast/references/restaurants/INSTRUCTIONS.md +165 -0
  172. package/skills/wix-headless-fast/references/restaurants/app/components/restaurants/MenuView.tsx +142 -0
  173. package/skills/wix-headless-fast/references/restaurants/app/components/restaurants/OrderCartButton.tsx +26 -0
  174. package/skills/wix-headless-fast/references/restaurants/app/components/restaurants/OrderCartDrawer.tsx +121 -0
  175. package/skills/wix-headless-fast/references/restaurants/app/components/restaurants/ReservationView.tsx +155 -0
  176. package/skills/wix-headless-fast/references/restaurants/app/hooks/restaurants/useMenus.ts +55 -0
  177. package/skills/wix-headless-fast/references/restaurants/app/hooks/restaurants/useOrderCart.ts +43 -0
  178. package/skills/wix-headless-fast/references/restaurants/app/hooks/restaurants/useReservation.ts +177 -0
  179. package/skills/wix-headless-fast/references/restaurants/app/wix/restaurants/menu.ts +165 -0
  180. package/skills/wix-headless-fast/references/restaurants/app/wix/restaurants/order-store.ts +103 -0
  181. package/skills/wix-headless-fast/references/restaurants/app/wix/restaurants/ordering.ts +254 -0
  182. package/skills/wix-headless-fast/references/restaurants/app/wix/restaurants/reservations.ts +146 -0
  183. package/skills/wix-headless-fast/references/restaurants/app/wix/restaurants/types.ts +168 -0
  184. package/skills/wix-headless-fast/references/restaurants/app-astro/layouts/SiteLayout.astro +47 -0
  185. package/skills/wix-headless-fast/references/restaurants/app-astro/pages/menu.astro +22 -0
  186. package/skills/wix-headless-fast/references/restaurants/app-astro/pages/reservations.astro +12 -0
  187. package/skills/wix-headless-fast/references/restaurants/lock/astro/package-lock.json +12560 -0
  188. package/skills/wix-headless-fast/references/restaurants/seed/SEED.md +81 -0
  189. package/skills/wix-headless-fast/references/restaurants/seed/seed-restaurants.mjs +479 -0
  190. package/skills/wix-headless-fast/references/shared/CONTENT.md +22 -0
  191. package/skills/wix-headless-fast/references/shared/CUSTOM_OPERATIONS.md +73 -0
  192. package/skills/wix-headless-fast/references/shared/DESIGN.md +26 -0
  193. package/skills/wix-headless-fast/references/shared/app/styles/global.css +52 -0
  194. package/skills/wix-headless-fast/references/shared/app/wix/config.ts +15 -0
  195. package/skills/wix-headless-fast/references/shared/app/wix/media.ts +27 -0
  196. package/skills/wix-headless-fast/references/shared/app/wix/money.ts +24 -0
  197. package/skills/wix-headless-fast/references/shared/app/wix/sdk.ts +76 -0
  198. package/skills/wix-headless-fast/references/shared/capabilities/media-upload/app/wix/media-upload/client.ts +46 -0
  199. package/skills/wix-headless-fast/references/shared/capabilities/media-upload/app-astro/pages/api/wix/media-upload.ts +46 -0
  200. package/skills/wix-headless-fast/references/shared/seed/images.mjs +145 -0
  201. package/skills/wix-headless-fast/references/storefront/INSTRUCTIONS.md +149 -0
  202. package/skills/wix-headless-fast/references/storefront/app/components/storefront/CartButton.tsx +26 -0
  203. package/skills/wix-headless-fast/references/storefront/app/components/storefront/CartDrawer.tsx +121 -0
  204. package/skills/wix-headless-fast/references/storefront/app/components/storefront/ProductCard.tsx +100 -0
  205. package/skills/wix-headless-fast/references/storefront/app/components/storefront/ProductDetailView.tsx +130 -0
  206. package/skills/wix-headless-fast/references/storefront/app/components/storefront/ProductGrid.tsx +48 -0
  207. package/skills/wix-headless-fast/references/storefront/app/components/storefront/ShopView.tsx +66 -0
  208. package/skills/wix-headless-fast/references/storefront/app/components/storefront/VariantPicker.tsx +103 -0
  209. package/skills/wix-headless-fast/references/storefront/app/hooks/storefront/useCart.ts +48 -0
  210. package/skills/wix-headless-fast/references/storefront/app/hooks/storefront/useProductDetail.ts +140 -0
  211. package/skills/wix-headless-fast/references/storefront/app/hooks/storefront/useShop.ts +80 -0
  212. package/skills/wix-headless-fast/references/storefront/app/wix/storefront/cart-store.ts +101 -0
  213. package/skills/wix-headless-fast/references/storefront/app/wix/storefront/cart.ts +221 -0
  214. package/skills/wix-headless-fast/references/storefront/app/wix/storefront/catalog.ts +215 -0
  215. package/skills/wix-headless-fast/references/storefront/app/wix/storefront/types.ts +109 -0
  216. package/skills/wix-headless-fast/references/storefront/app-astro/layouts/SiteLayout.astro +46 -0
  217. package/skills/wix-headless-fast/references/storefront/app-astro/pages/products/[slug].astro +56 -0
  218. package/skills/wix-headless-fast/references/storefront/app-astro/pages/shop.astro +23 -0
  219. package/skills/wix-headless-fast/references/storefront/lock/astro/package-lock.json +12247 -0
  220. package/skills/wix-headless-fast/references/storefront/seed/SEED.md +85 -0
  221. package/skills/wix-headless-fast/references/storefront/seed/seed-store.mjs +415 -0
  222. package/skills/wix-manage/SKILL.md +28 -2
  223. package/skills/wix-manage/references/bookings/booking-system-integration-gaps.md +20 -13
  224. package/skills/wix-manage/references/bookings/end-to-end-booking-flow.md +24 -11
  225. package/skills/wix-manage/references/cms/cms-ecommerce-catalog-integration.md +5 -5
  226. package/skills/wix-manage/references/google-ads/manage-campaign-success-guide.md +141 -0
  227. package/skills/wix-manage/references/google-business-profile/connect-google-business-profile.md +134 -0
  228. package/skills/wix-manage/references/google-business-profile/manage-google-business-profile-locations.md +182 -0
  229. package/skills/wix-manage/references/marketing/create-and-publish-social-post.md +3 -0
  230. package/skills/wix-manage/references/seo/manage-seo-tags.md +315 -0
  231. package/skills/wix-manage/references/seo/manage-url-redirects.md +250 -0
  232. package/skills/wix-manage/references/sites/query-sites.md +72 -161
  233. package/skills/wix-manage/references/stores/create-product-catalog-v3.md +21 -6
  234. package/skills/wix-manage/references/stores/update-product-with-options.md +83 -0
  235. package/skills/wix-replatform/resources/rp-mapper/wix-business-solutions-taxonomy.md +5 -6
  236. package/skills/wix-vibe-headless/SKILL.md +18 -4
  237. package/skills/wix-vibe-headless/install/deploy.cjs +12 -4
  238. package/skills/wix-vibe-headless/install/pin-agents-md.cjs +2 -1
  239. package/skills/wix-vibe-headless/platforms/base44-ecom-light-seed.md +16 -10
  240. package/skills/wix-vibe-headless/platforms/base44-ecom-light.md +13 -8
  241. package/skills/wix-vibe-headless/platforms/base44.md +27 -62
  242. package/skills/wix-vibe-headless/platforms/generic.md +6 -3
  243. package/skills/wix-vibe-headless/references/bookings/INSTRUCTIONS.md +45 -0
  244. package/skills/wix-vibe-headless/references/bookings/app/components/RentalDurationPicker.jsx +67 -0
  245. package/skills/wix-vibe-headless/references/bookings/app/hooks/useRentalDuration.js +128 -0
  246. package/skills/wix-vibe-headless/references/bookings/app/hooks/useServiceDetail.js +5 -3
  247. package/skills/wix-vibe-headless/references/bookings/app/rest/wix-bookings-checkout.js +9 -8
  248. package/skills/wix-vibe-headless/references/bookings/app/rest/wix-bookings-rentals.js +250 -0
  249. package/skills/wix-vibe-headless/references/bookings/app/rest/wix-bookings-services.js +12 -5
  250. package/skills/wix-vibe-headless/references/bookings/seed/SEED.md +41 -0
  251. package/skills/wix-vibe-headless/references/bookings/seed/seed-rentals.js +267 -0
  252. package/skills/wix-vibe-headless/references/cms/INSTRUCTIONS.md +6 -3
  253. package/skills/wix-vibe-headless/references/forms/INSTRUCTIONS.md +470 -0
  254. package/skills/wix-vibe-headless/references/forms/app/hooks/useWixForm.js +425 -0
  255. package/skills/wix-vibe-headless/references/forms/app/lib/wix-form-schema-utils.js +187 -0
  256. package/skills/wix-vibe-headless/references/forms/app/rest/wix-forms-submissions.js +238 -0
  257. package/skills/wix-vibe-headless/references/forms/app/rest/wix-forms.js +108 -0
  258. package/skills/wix-vibe-headless/references/forms/seed/SEED.md +1762 -0
  259. package/skills/wix-vibe-headless/references/rentals/INSTRUCTIONS.md +13 -0
  260. package/skills/wix-vibe-headless/references/restaurants/INSTRUCTIONS.md +4 -1
  261. package/skills/wix-vibe-headless/references/restaurants/app/components/OrderCartDrawer.jsx +23 -11
  262. package/skills/wix-vibe-headless/references/restaurants/app/context/OrderCartContext.jsx +1 -1
  263. package/skills/wix-vibe-headless/references/restaurants/app/rest/wix-restaurants-ordering.js +29 -31
  264. package/skills/wix-vibe-headless/references/storefront/INSTRUCTIONS.md +152 -92
  265. package/skills/wix-vibe-headless/references/storefront/app/components/CartDrawer.jsx +37 -38
  266. package/skills/wix-vibe-headless/references/storefront/app/context/CartContext.jsx +2 -2
  267. package/skills/wix-vibe-headless/references/storefront/app/hooks/useProductDetail.js +15 -8
  268. package/skills/wix-vibe-headless/references/storefront/app/lib/storeImage.js +37 -0
  269. package/skills/wix-vibe-headless/references/storefront/app/rest/wix-store-cart.js +35 -35
  270. package/skills/wix-vibe-headless/references/storefront/app/rest/wix-store-catalog.js +18 -6
  271. package/skills/wix-vibe-headless/references/storefront/seed/SEED.md +30 -7
  272. package/skills/wix-vibe-headless/references/storefront/seed/seed-store.js +46 -10
  273. package/skills/wix-app/references/editor-react-component/A11Y-REVIEW-REFERENCE.md +0 -172
  274. package/skills/wix-app/references/editor-react-component/A11Y-REVIEW.md +0 -143
  275. package/skills/wix-app/references/editor-react-component/COMPONENT-API.md +0 -516
  276. package/skills/wix-app/references/editor-react-component/COMPONENT-CONFIGURATION.md +0 -225
  277. package/skills/wix-app/references/editor-react-component/EDIT-FLOW.md +0 -6
  278. package/skills/wix-app/references/editor-react-component/REACT-PATTERNS.md +0 -95
  279. package/skills/wix-vibe-headless/references/storefront/app/components/ProductCard.jsx +0 -110
  280. package/skills/wix-vibe-headless/references/storefront/app/components/ProductGallery.jsx +0 -51
  281. package/skills/wix-vibe-headless/references/storefront/app/components/ProductGrid.jsx +0 -49
  282. package/skills/wix-vibe-headless/references/storefront/app/components/VariantPicker.jsx +0 -92
  283. package/skills/wix-vibe-headless/references/storefront/app/pages/ProductDetail.jsx +0 -139
@@ -0,0 +1,1762 @@
1
+ # Forms — seeding (Form Schemas v4 REST)
2
+
3
+ Creating a form is an **admin/build-time** job, in six sequential steps. Each has a section below.
4
+
5
+ 1. **Authenticate** — get an elevated credential; the public client ID cannot write.
6
+ 2. **Install the Wix Forms app** — idempotent, and nothing works until it's there.
7
+ 3. **Author the form body** — adapt the every-field payload to what the request asks for.
8
+ 4. **Create the form** — POST each body; a `200` here means almost nothing.
9
+ 5. **Verify it works** — read the form back, and **submit to it once** for real.
10
+ 6. **Hand off** — the verified `formId` + field `target`s are written to a file the UI imports.
11
+
12
+ ## API reference
13
+
14
+ Wix Forms is a **CRM** API, not Business Solutions. Read the page before writing a call you don't
15
+ find here — never guess a shape. For anything these pages don't settle — a response shape you didn't
16
+ expect, or an operation this doc doesn't cover — use the **`wix-docs`** skill to search + read the
17
+ live Wix API reference.
18
+
19
+ | step | title | page | what it settles |
20
+ |---|---|---|---|
21
+ | 3 | About Form Fields | https://dev.wix.com/docs/api-reference/crm/forms/form-schemas/about-form-fields.md | every field-level rule: the identifier/inputType/componentType table, validation, choice fields, contact mapping, layout |
22
+ | 3 | Create Form | https://dev.wix.com/docs/api-reference/crm/forms/form-schemas/create-form.md | the create call, plus 10 complete request examples — the source of the payload below |
23
+ | 3 | Form object | https://dev.wix.com/docs/api-reference/crm/forms/form-schemas/form-object.md | each property individually, incl. form-level settings this doc doesn't cover |
24
+ | 4 | Form Schemas API | https://dev.wix.com/docs/api-reference/crm/forms/form-schemas.md | every schema method (get, list, delete, enable/disable) |
25
+ | 4 | Update Form | https://dev.wix.com/docs/api-reference/crm/forms/form-schemas/update-form.md | revising a form without losing its `formId` |
26
+ | 4 | List Forms Providers Configs | https://dev.wix.com/docs/api-reference/crm/forms/form-schemas/list-forms-providers-configs.md | the Forms **app's** ceiling on fields and forms — **not** the site's plan cap, which this call cannot tell you (see step 4) |
27
+ | 5 | Create Submission | https://dev.wix.com/docs/api-reference/crm/forms/form-submissions/create-submission.md | the submission call used to prove the form accepts data |
28
+ | 5 | About Submission Values | https://dev.wix.com/docs/api-reference/crm/forms/form-submissions/about-submission-values.md | the value shape each `inputType` submits — string, array, address object, … |
29
+ | 5 | Validation errors | https://dev.wix.com/docs/api-reference/crm/forms/form-submissions/introduction.md#validation-errors | what a rejected submission is telling you |
30
+ | — | Form Submissions API | https://dev.wix.com/docs/api-reference/crm/forms/form-submissions.md | every submission method, incl. delete (used to clean up the test submission) |
31
+
32
+ **⛔ Additive only — never delete, reset, or overwrite existing forms**, even ones that look like the
33
+ install's own sample.
34
+
35
+ **⚠️ Seed BEFORE the form's UI.** Forms is the one vertical that does not run in parallel with the
36
+ client: its inputs bind to the schema's field `target`s, so nothing may be built against a form that
37
+ hasn't been created *and verified*.
38
+
39
+ ## 1 · Authenticate
40
+
41
+ Every call in this doc needs an **elevated credential** — a connector/OAuth access token, or a Wix
42
+ API key. The public `WIX_CLIENT_ID` cannot write; see the platform doc's seed-auth step. There is
43
+ **no helper module** — you make each call yourself with the shapes below.
44
+
45
+ **Never inline the raw token/API key** into a command — it would end up in the transcript, exec logs,
46
+ and shell history. Keep it in a variable and reference it. On Base44 (and any exec-tool platform),
47
+ take it from the connector and call with `fetch()` rather than shelling out to curl:
48
+
49
+ ```js
50
+ const { accessToken } = await base44.asServiceRole.connectors.getConnection("wix"); // stays in memory
51
+ ```
52
+
53
+ On any other platform, load it into an env var from your secret manager and don't echo it. Either
54
+ way, every call below sends the same three **standard headers** — referred to as such from here on:
55
+
56
+ ```
57
+ Authorization: Bearer <token> // a Wix API key goes in RAW, with no "Bearer"
58
+ wix-site-id: <METASITE_ID>
59
+ Content-Type: application/json
60
+ ```
61
+
62
+ ## 2 · Install the Wix Forms app
63
+
64
+ ```
65
+ POST https://www.wixapis.com/apps-installer-service/v1/app-instance/install
66
+ {
67
+ "tenant": { "tenantType": "SITE", "id": "<METASITE_ID>" },
68
+ "appInstance": { "appDefId": "225dd912-7dea-4738-8688-4b8c6955ffc2", "enabled": true }
69
+ }
70
+ ```
71
+
72
+ `225dd912-7dea-4738-8688-4b8c6955ffc2` is the Wix Forms app. Until it is installed **every** Form
73
+ Schemas call fails with `UNSUPPORTED_FORM_NAMESPACE`, so run this before step 4. The call is
74
+ idempotent — re-installing returns `200` — and Base44 sites often don't have the app, so re-running
75
+ costs nothing.
76
+
77
+ ## 3 · Author the form body — every field type
78
+
79
+ There is **one** create call:
80
+ `POST https://www.wixapis.com/form-schema-service/v4/forms` with `{ "form": { … } }`.
81
+ **You author that body**, starting from the payload below and adapting it to the request.
82
+
83
+ The payload is one form holding **every field type Wix Forms supports**. Each field block is copied
84
+ verbatim from the official Create Form examples, so the `identifier` / `inputType` / `componentType`
85
+ triple, the options objects and the validation shapes are the ones Wix actually accepts. (Two
86
+ exceptions: **Donation** comes from About Form Fields, and **Custom price** is the one field with no
87
+ shipped example — it is composed from the property reference.)
88
+
89
+ *(Authoring side: which JSON creates each field. The rendering side — which control each one wants
90
+ and what its value looks like — is the matching table in `INSTRUCTIONS.md`; they join on
91
+ `identifier`.)*
92
+
93
+ | field | `identifier` | `inputType` | `componentType` | submits | requires |
94
+ |-----------------------------------|-------------------------|--------------|---------------------------|---------|---------------------|
95
+ | **Text & number** | | | | | |
96
+ | Short answer | `TEXT_INPUT` | `STRING` | `TEXT_INPUT` | string | |
97
+ | Long answer | `TEXT_AREA` | `STRING` | `TEXT_INPUT` | string | |
98
+ | Number | `NUMBER_INPUT` | `NUMBER` | `NUMBER_INPUT` | number | |
99
+ | Rating | `RATING_INPUT` | `NUMBER` | `RATING_INPUT` | number | |
100
+ | Link | `URL_INPUT` | `STRING` | `TEXT_INPUT` | string | |
101
+ | **Choice** | | | | | |
102
+ | Dropdown | `DROPDOWN` | `STRING` | `DROPDOWN` | string | |
103
+ | Single choice | `RADIO_GROUP` | `STRING` | `RADIO_GROUP` | string | |
104
+ | Multi choice | `CHECKBOX_GROUP` | `ARRAY` | `CHECKBOX_GROUP` | array | |
105
+ | Tag picker | `TAGS` | `ARRAY` | `TAGS` | array | |
106
+ | Image choice | `IMAGE_CHOICE` | `ARRAY` | `CHECKBOX_GROUP` | array | |
107
+ | Checkbox | `CHECKBOX` | `BOOLEAN` | `CHECKBOX` | boolean | |
108
+ | **Date & time** | | | | | |
109
+ | Date | `DATE_INPUT` | `STRING` | `DATE_INPUT` | string | |
110
+ | Date picker | `DATE_PICKER` | `STRING` | `DATE_PICKER` | string | |
111
+ | Date and time | `DATE_TIME_INPUT` | `STRING` | `DATE_TIME` | string | |
112
+ | Time | `TIME_INPUT` | `STRING` | `TIME_INPUT` | string | |
113
+ | **Contact-mapped** | | | | | |
114
+ | First name | `CONTACTS_FIRST_NAME` | `STRING` | `TEXT_INPUT` | string | |
115
+ | Last name | `CONTACTS_LAST_NAME` | `STRING` | `TEXT_INPUT` | string | |
116
+ | Email | `CONTACTS_EMAIL` | `STRING` | `TEXT_INPUT` | string | |
117
+ | Phone | `CONTACTS_PHONE` | `STRING` | `PHONE_INPUT` | string | |
118
+ | Company | `CONTACTS_COMPANY` | `STRING` | `TEXT_INPUT` | string | |
119
+ | Position | `CONTACTS_POSITION` | `STRING` | `TEXT_INPUT` | string | |
120
+ | Tax ID → contact `VAT_ID` | `CONTACTS_TAX_ID` | `STRING` | `TEXT_INPUT` | string | |
121
+ | Birthdate | `CONTACTS_BIRTHDATE` | `STRING` | `DATE_INPUT` | string | |
122
+ | Subscribe checkbox | `CONTACTS_SUBSCRIBE` | `BOOLEAN` | `CHECKBOX` | boolean | |
123
+ | Address (single line) | `CONTACTS_ADDRESS` | `STRING` | `TEXT_INPUT` | string | |
124
+ | Address (multi-line) | `MULTILINE_ADDRESS` | `ADDRESS` | `MULTILINE_ADDRESS` | object | |
125
+ | **File (premium)** | | | | | |
126
+ | File upload | `FILE_UPLOAD` | `WIX_FILE` | `FILE_UPLOAD` | file | Premium |
127
+ | Signature | `SIGNATURE` | `WIX_FILE` | `SIGNATURE` | file | Premium |
128
+ | **Payment (premium + eCommerce)** | | | | | |
129
+ | Product | `PRODUCT_LIST` | `PAYMENT` | `CHECKBOX_GROUP` | payment | Premium + eCommerce |
130
+ | Fixed price | `FIXED_PAYMENT` | `PAYMENT` | `FIXED_PAYMENT` | payment | Premium + eCommerce |
131
+ | Custom price | `PAYMENT_INPUT` | `PAYMENT` | `PAYMENT_INPUT` | payment | Premium + eCommerce |
132
+ | Donation | `DONATION` | `PAYMENT` | `DONATION_INPUT` | payment | Premium + eCommerce |
133
+ | **Scheduling (other Wix apps)** | | | | | |
134
+ | Appointment | `APPOINTMENT` | `SCHEDULING` | `APPOINTMENT` | booking | Wix Meetings |
135
+ | Service picker | `SERVICES_DROPDOWN` | `STRING` | `SERVICES_DROPDOWN` | string | Wix Services |
136
+ | Multi-service picker | `SERVICES_MULTI_CHOICE` | `ARRAY` | `SERVICES_CHECKBOX_GROUP` | array | Wix Services |
137
+ | **Display (collects nothing)** | | | | | |
138
+ | Rich content | `RICH_TEXT` | — | `RICH_CONTENT` * | — | |
139
+ | Submit button | `SUBMIT_BUTTON` | — | `PAGE_NAVIGATION` * | — | |
140
+
141
+ \* A display field sets `fieldType: "DISPLAY"` and has neither an input type nor a
142
+ component type — the value shown is its `displayOptions.displayFieldType`.
143
+
144
+ ### **Non-negotiable** rules for adapting the payload
145
+
146
+ Change the fields, labels, options and targets freely — these seven rules **must** still hold in
147
+ whatever you send. Break one and the create still returns `200`; the damage shows up in the
148
+ owner's dashboard, or on the first real submission.
149
+
150
+ - **Every `id` is a lowercase UUID v4, unique within the form** — generate it for each field and every choice `option`.
151
+ Then use those UUIDs where reference to a field or an option is required.
152
+ - Use only **form.formFields** for fields, **never `form.fields` - that's legacy API**
153
+ - **`steps` must reference every field, including the `SUBMIT_BUTTON`.** Field that is not referenced in any
154
+ step will not be visible in the business manager.
155
+ - **`required` lives at `inputOptions.required`**, never inside a validation block.
156
+ - **`validation` is always present**, even as `{}`, and nests under the **`inputType`** options
157
+ object — not the `componentType` one.
158
+ - **A choice field declares its options twice** — the component's `options[]` and the validation
159
+ `enum` (`STRING`) or `items.stringOptions.enum` + `itemType` (`ARRAY`) — and the two must agree.
160
+ Get it wrong and the create still returns `200`: the field is created as a **plain text box**,
161
+ losing its choices. Only the 5a component check catches it.
162
+ - **`target` is the immutable submission key**: starts with an ASCII letter, letters/digits/`_`
163
+ only, no `__`, unique within the form. Use field's label converted to snake_case with _ and 6 random alphanumeric
164
+ characters as the field target, e.g. "First name" -> `first_name_a689be`.
165
+
166
+ ```json
167
+ {
168
+ "form": {
169
+ "name": "Every field type",
170
+ "namespace": "wix.form_app.form",
171
+ "formFields": [
172
+ {
173
+ "id": "4add0e51-a168-4ab6-76ff-834d782fb4d9",
174
+ "identifier": "TEXT_INPUT",
175
+ "fieldType": "INPUT",
176
+ "inputOptions": {
177
+ "target": "improve_e62b",
178
+ "inputType": "STRING",
179
+ "stringOptions": {
180
+ "validation": {},
181
+ "componentType": "TEXT_INPUT",
182
+ "textInputOptions": {
183
+ "label": "What is one thing we could improve?",
184
+ "showLabel": true
185
+ }
186
+ }
187
+ }
188
+ },
189
+ {
190
+ "id": "bbecbd37-ca52-4fa6-a92c-90e70aa4ec2a",
191
+ "identifier": "TEXT_AREA",
192
+ "fieldType": "INPUT",
193
+ "inputOptions": {
194
+ "target": "message_7634",
195
+ "inputType": "STRING",
196
+ "stringOptions": {
197
+ "validation": {},
198
+ "componentType": "TEXT_INPUT",
199
+ "textInputOptions": {
200
+ "label": "Your message",
201
+ "showLabel": true
202
+ }
203
+ }
204
+ }
205
+ },
206
+ {
207
+ "id": "7e2a15c8-0b34-49df-86a1-c40f9d73e526",
208
+ "identifier": "NUMBER_INPUT",
209
+ "fieldType": "INPUT",
210
+ "inputOptions": {
211
+ "target": "team_size_9b47",
212
+ "inputType": "NUMBER",
213
+ "numberOptions": {
214
+ "componentType": "NUMBER_INPUT",
215
+ "numberInputOptions": {
216
+ "label": "Team size",
217
+ "showLabel": true
218
+ },
219
+ "validation": {}
220
+ }
221
+ }
222
+ },
223
+ {
224
+ "id": "a5f82c31-7d09-4e6b-b384-0c15fe739a2d",
225
+ "identifier": "RATING_INPUT",
226
+ "fieldType": "INPUT",
227
+ "inputOptions": {
228
+ "target": "overall_rating_8c46",
229
+ "inputType": "NUMBER",
230
+ "numberOptions": {
231
+ "componentType": "RATING_INPUT",
232
+ "ratingInputOptions": {
233
+ "label": "How would you rate your overall experience?",
234
+ "showLabel": true,
235
+ "defaultValue": 3
236
+ },
237
+ "validation": {}
238
+ }
239
+ }
240
+ },
241
+ {
242
+ "id": "4913d7ab-352a-481b-831f-ee8beb895b64",
243
+ "identifier": "URL_INPUT",
244
+ "fieldType": "INPUT",
245
+ "inputOptions": {
246
+ "target": "portfolio_d31f",
247
+ "inputType": "STRING",
248
+ "stringOptions": {
249
+ "validation": {
250
+ "format": "URL"
251
+ },
252
+ "componentType": "TEXT_INPUT",
253
+ "textInputOptions": {
254
+ "label": "Portfolio link",
255
+ "showLabel": true
256
+ }
257
+ }
258
+ }
259
+ },
260
+ {
261
+ "id": "3b6d9e21-84c7-4f05-a913-2e7d0c5b48f1",
262
+ "identifier": "DROPDOWN",
263
+ "fieldType": "INPUT",
264
+ "inputOptions": {
265
+ "target": "project_type_5c1a",
266
+ "inputType": "STRING",
267
+ "stringOptions": {
268
+ "validation": {
269
+ "enum": [
270
+ "Brand identity",
271
+ "Website redesign"
272
+ ]
273
+ },
274
+ "componentType": "DROPDOWN",
275
+ "dropdownOptions": {
276
+ "label": "Project type",
277
+ "showLabel": true,
278
+ "options": [
279
+ {
280
+ "id": "32d1d5a1-0ecf-4cff-eb22-c9334fb2f5f8",
281
+ "label": "Brand identity",
282
+ "value": "Brand identity"
283
+ },
284
+ {
285
+ "id": "ff79e749-c49e-4db8-eebb-6062e7aed6c6",
286
+ "label": "Website redesign",
287
+ "value": "Website redesign"
288
+ }
289
+ ],
290
+ "customOption": {
291
+ "label": "Other",
292
+ "placeholder": "Tell us about your project"
293
+ }
294
+ }
295
+ }
296
+ }
297
+ },
298
+ {
299
+ "id": "50de5707-06aa-49e7-ba63-cabf0b8bc7e2",
300
+ "identifier": "RADIO_GROUP",
301
+ "fieldType": "INPUT",
302
+ "inputOptions": {
303
+ "target": "heard_about_us_3978",
304
+ "inputType": "STRING",
305
+ "stringOptions": {
306
+ "validation": {
307
+ "enum": [
308
+ "Search engine",
309
+ "Social media",
310
+ "A friend"
311
+ ]
312
+ },
313
+ "componentType": "RADIO_GROUP",
314
+ "radioGroupOptions": {
315
+ "label": "How did you hear about us?",
316
+ "showLabel": true,
317
+ "numberOfColumns": "ONE",
318
+ "options": [
319
+ {
320
+ "id": "89955e02-2f29-4fca-85a9-d026854ec72d",
321
+ "label": "Search engine",
322
+ "value": "Search engine"
323
+ },
324
+ {
325
+ "id": "e6b43c3c-0224-4946-c4cf-5ef4fb34fd37",
326
+ "label": "Social media",
327
+ "value": "Social media"
328
+ },
329
+ {
330
+ "id": "7a1c4d92-8f63-4b05-9e27-3d80fa15c6b4",
331
+ "label": "A friend",
332
+ "value": "A friend"
333
+ }
334
+ ]
335
+ }
336
+ }
337
+ }
338
+ },
339
+ {
340
+ "id": "7fe8d8a5-6075-4c81-6678-662fe3ca48e4",
341
+ "identifier": "CHECKBOX_GROUP",
342
+ "fieldType": "INPUT",
343
+ "inputOptions": {
344
+ "target": "services_used_21e8",
345
+ "inputType": "ARRAY",
346
+ "arrayOptions": {
347
+ "validation": {
348
+ "items": {
349
+ "itemType": "STRING",
350
+ "stringOptions": {
351
+ "enum": [
352
+ "Online store",
353
+ "Support",
354
+ "Consultation"
355
+ ]
356
+ }
357
+ }
358
+ },
359
+ "componentType": "CHECKBOX_GROUP",
360
+ "checkboxGroupOptions": {
361
+ "label": "Which services did you use?",
362
+ "showLabel": true,
363
+ "numberOfColumns": "ONE",
364
+ "options": [
365
+ {
366
+ "id": "fbcb7e1f-3280-4808-affc-8336efd3e2bf",
367
+ "label": "Online store",
368
+ "value": "Online store"
369
+ },
370
+ {
371
+ "id": "b8a9a269-c622-4de5-2606-3046a3974238",
372
+ "label": "Support",
373
+ "value": "Support"
374
+ },
375
+ {
376
+ "id": "c40e8b17-6a95-42d3-b8f1-05e7d2934ac6",
377
+ "label": "Consultation",
378
+ "value": "Consultation"
379
+ }
380
+ ]
381
+ }
382
+ }
383
+ }
384
+ },
385
+ {
386
+ "id": "8c5b3d47-e109-42fa-b6c8-71e4a03f9d52",
387
+ "identifier": "TAGS",
388
+ "fieldType": "INPUT",
389
+ "inputOptions": {
390
+ "target": "services_7f30",
391
+ "inputType": "ARRAY",
392
+ "arrayOptions": {
393
+ "validation": {
394
+ "items": {
395
+ "itemType": "STRING",
396
+ "stringOptions": {
397
+ "enum": [
398
+ "Logo design",
399
+ "Copywriting"
400
+ ]
401
+ }
402
+ }
403
+ },
404
+ "componentType": "TAGS",
405
+ "tagsOptions": {
406
+ "label": "Services you need",
407
+ "showLabel": true,
408
+ "numberOfColumns": "ZERO",
409
+ "options": [
410
+ {
411
+ "id": "91cbad08-66a2-41dd-f88f-1fad48883076",
412
+ "label": "Logo design",
413
+ "value": "Logo design"
414
+ },
415
+ {
416
+ "id": "451a65af-596b-41be-865f-5e98ce21178f",
417
+ "label": "Copywriting",
418
+ "value": "Copywriting"
419
+ }
420
+ ]
421
+ }
422
+ }
423
+ }
424
+ },
425
+ {
426
+ "id": "d419f6b0-5c82-4e17-93ad-6f108b2c7e34",
427
+ "identifier": "IMAGE_CHOICE",
428
+ "fieldType": "INPUT",
429
+ "inputOptions": {
430
+ "target": "design_styles_2d68",
431
+ "inputType": "ARRAY",
432
+ "arrayOptions": {
433
+ "validation": {
434
+ "items": {
435
+ "itemType": "STRING",
436
+ "stringOptions": {
437
+ "enum": [
438
+ "Minimal",
439
+ "Editorial"
440
+ ]
441
+ }
442
+ }
443
+ },
444
+ "componentType": "CHECKBOX_GROUP",
445
+ "checkboxGroupOptions": {
446
+ "label": "Preferred design styles",
447
+ "showLabel": true,
448
+ "numberOfColumns": "TWO",
449
+ "options": [
450
+ {
451
+ "id": "06a38503-b5a7-4499-c46b-a93c3b305104",
452
+ "label": "Minimal",
453
+ "value": "Minimal",
454
+ "media": {
455
+ "image": {
456
+ "id": "8fc025_3ec045fddc7248b0836eed30b4ed1929~mv2.jpg",
457
+ "url": "https://static.wixstatic.com/media/8fc025_3ec045fddc7248b0836eed30b4ed1929~mv2.jpg",
458
+ "altText": "Minimal design style"
459
+ }
460
+ }
461
+ },
462
+ {
463
+ "id": "3802532c-6899-40ea-5e30-a3256ad0a1c6",
464
+ "label": "Editorial",
465
+ "value": "Editorial",
466
+ "media": {
467
+ "image": {
468
+ "id": "8fc025_b71e4a09cd8f4c1e93b7d05a26fc8e37~mv2.jpg",
469
+ "url": "https://static.wixstatic.com/media/8fc025_b71e4a09cd8f4c1e93b7d05a26fc8e37~mv2.jpg",
470
+ "altText": "Editorial design style"
471
+ }
472
+ }
473
+ }
474
+ ],
475
+ "optionsMediaSettings": {
476
+ "imageAlignment": "CENTER",
477
+ "imageFit": "COVER"
478
+ }
479
+ }
480
+ }
481
+ }
482
+ },
483
+ {
484
+ "id": "62e0c8f5-9a34-4d61-b7fe-05c9138d24a7",
485
+ "identifier": "CHECKBOX",
486
+ "fieldType": "INPUT",
487
+ "inputOptions": {
488
+ "target": "terms_b613",
489
+ "required": true,
490
+ "inputType": "BOOLEAN",
491
+ "booleanOptions": {
492
+ "componentType": "CHECKBOX",
493
+ "checkboxOptions": {
494
+ "label": {
495
+ "nodes": [
496
+ {
497
+ "type": "PARAGRAPH",
498
+ "id": "ipl8z25",
499
+ "nodes": [
500
+ {
501
+ "type": "TEXT",
502
+ "id": "",
503
+ "nodes": [],
504
+ "textData": {
505
+ "text": "I accept the studio terms and conditions.",
506
+ "decorations": []
507
+ }
508
+ }
509
+ ],
510
+ "paragraphData": {
511
+ "textStyle": {
512
+ "textAlignment": "AUTO"
513
+ }
514
+ }
515
+ }
516
+ ]
517
+ }
518
+ },
519
+ "validation": {}
520
+ }
521
+ }
522
+ },
523
+ {
524
+ "id": "76976adf-3cc4-453e-863b-577cbb619a45",
525
+ "identifier": "DATE_INPUT",
526
+ "fieldType": "INPUT",
527
+ "inputOptions": {
528
+ "target": "available_from_4784",
529
+ "inputType": "STRING",
530
+ "stringOptions": {
531
+ "validation": {
532
+ "format": "DATE"
533
+ },
534
+ "componentType": "DATE_INPUT",
535
+ "dateInputOptions": {
536
+ "label": "Available from",
537
+ "showLabel": true,
538
+ "showPlaceholder": false,
539
+ "showDateLabels": true
540
+ }
541
+ }
542
+ }
543
+ },
544
+ {
545
+ "id": "b7c4bc3b-62a7-4746-33bd-c6d46e39ce33",
546
+ "identifier": "DATE_PICKER",
547
+ "fieldType": "INPUT",
548
+ "inputOptions": {
549
+ "target": "delivery_date_abfa",
550
+ "inputType": "STRING",
551
+ "stringOptions": {
552
+ "validation": {
553
+ "format": "DATE"
554
+ },
555
+ "componentType": "DATE_PICKER",
556
+ "datePickerOptions": {
557
+ "label": "Preferred delivery date",
558
+ "showLabel": true,
559
+ "firstDayOfWeek": "MONDAY"
560
+ }
561
+ }
562
+ }
563
+ },
564
+ {
565
+ "id": "15fa8e6c-3d71-4b09-a2e5-9c86d4170fb3",
566
+ "identifier": "DATE_TIME_INPUT",
567
+ "fieldType": "INPUT",
568
+ "inputOptions": {
569
+ "target": "kickoff_call_4e91",
570
+ "inputType": "STRING",
571
+ "stringOptions": {
572
+ "validation": {
573
+ "format": "DATE_TIME"
574
+ },
575
+ "componentType": "DATE_TIME",
576
+ "dateTimeOptions": {
577
+ "label": "Kickoff call date and time",
578
+ "showLabel": true,
579
+ "showPlaceholder": false,
580
+ "showDateLabels": true,
581
+ "use24HourFormat": true
582
+ }
583
+ }
584
+ }
585
+ },
586
+ {
587
+ "id": "905345fa-e7fe-44c0-e114-4999a6e89f79",
588
+ "identifier": "TIME_INPUT",
589
+ "fieldType": "INPUT",
590
+ "inputOptions": {
591
+ "target": "delivery_time_b37e",
592
+ "inputType": "STRING",
593
+ "stringOptions": {
594
+ "validation": {
595
+ "format": "TIME"
596
+ },
597
+ "componentType": "TIME_INPUT",
598
+ "timeInputOptions": {
599
+ "label": "Preferred delivery time",
600
+ "showLabel": true,
601
+ "showPlaceholder": false,
602
+ "use24HourFormat": true
603
+ }
604
+ }
605
+ }
606
+ },
607
+ {
608
+ "id": "d7665e98-a7c4-4829-c104-fb856883e043",
609
+ "identifier": "CONTACTS_FIRST_NAME",
610
+ "fieldType": "INPUT",
611
+ "inputOptions": {
612
+ "target": "first_name_f409",
613
+ "pii": true,
614
+ "contactMapping": {
615
+ "contactField": "FIRST_NAME"
616
+ },
617
+ "inputType": "STRING",
618
+ "stringOptions": {
619
+ "validation": {},
620
+ "componentType": "TEXT_INPUT",
621
+ "textInputOptions": {
622
+ "label": "First name",
623
+ "showLabel": true
624
+ }
625
+ }
626
+ }
627
+ },
628
+ {
629
+ "id": "740e294e-6ee4-4cda-c902-823002064985",
630
+ "identifier": "CONTACTS_LAST_NAME",
631
+ "fieldType": "INPUT",
632
+ "inputOptions": {
633
+ "target": "last_name_b88c",
634
+ "pii": true,
635
+ "contactMapping": {
636
+ "contactField": "LAST_NAME"
637
+ },
638
+ "inputType": "STRING",
639
+ "stringOptions": {
640
+ "validation": {},
641
+ "componentType": "TEXT_INPUT",
642
+ "textInputOptions": {
643
+ "label": "Last name",
644
+ "showLabel": true
645
+ }
646
+ }
647
+ }
648
+ },
649
+ {
650
+ "id": "19768973-65be-4a6f-b3de-57cfb1da48db",
651
+ "identifier": "CONTACTS_EMAIL",
652
+ "fieldType": "INPUT",
653
+ "inputOptions": {
654
+ "target": "email_673d",
655
+ "pii": true,
656
+ "required": true,
657
+ "contactMapping": {
658
+ "contactField": "EMAIL",
659
+ "emailInfo": {
660
+ "tag": "UNTAGGED"
661
+ }
662
+ },
663
+ "inputType": "STRING",
664
+ "stringOptions": {
665
+ "validation": {
666
+ "format": "EMAIL"
667
+ },
668
+ "componentType": "TEXT_INPUT",
669
+ "textInputOptions": {
670
+ "label": "Email",
671
+ "showLabel": true,
672
+ "placeholder": "Enter your email"
673
+ }
674
+ }
675
+ }
676
+ },
677
+ {
678
+ "id": "95d528a8-8f3d-4692-7363-44db1f96ca18",
679
+ "identifier": "CONTACTS_PHONE",
680
+ "fieldType": "INPUT",
681
+ "inputOptions": {
682
+ "target": "phone_6a4b",
683
+ "pii": true,
684
+ "contactMapping": {
685
+ "contactField": "PHONE",
686
+ "phoneInfo": {
687
+ "tag": "UNTAGGED"
688
+ }
689
+ },
690
+ "inputType": "STRING",
691
+ "stringOptions": {
692
+ "validation": {
693
+ "format": "PHONE",
694
+ "phoneOptions": {
695
+ "allowedCountryCodes": [
696
+ "US",
697
+ "GB",
698
+ "CA",
699
+ "AU",
700
+ "DE",
701
+ "FR",
702
+ "IL"
703
+ ]
704
+ }
705
+ },
706
+ "componentType": "PHONE_INPUT",
707
+ "phoneInputOptions": {
708
+ "label": "Phone",
709
+ "showLabel": true,
710
+ "placeholder": "Enter your phone number"
711
+ }
712
+ }
713
+ }
714
+ },
715
+ {
716
+ "id": "7b21e4d6-0a93-4c58-8f37-15d0ba69c284",
717
+ "identifier": "CONTACTS_COMPANY",
718
+ "fieldType": "INPUT",
719
+ "inputOptions": {
720
+ "target": "company_5a1c",
721
+ "pii": true,
722
+ "required": true,
723
+ "contactMapping": {
724
+ "contactField": "COMPANY"
725
+ },
726
+ "inputType": "STRING",
727
+ "stringOptions": {
728
+ "validation": {},
729
+ "componentType": "TEXT_INPUT",
730
+ "textInputOptions": {
731
+ "label": "Company name",
732
+ "showLabel": true
733
+ }
734
+ }
735
+ }
736
+ },
737
+ {
738
+ "id": "e8d3f907-b26a-4715-9c04-3a7e15bd6f82",
739
+ "identifier": "CONTACTS_POSITION",
740
+ "fieldType": "INPUT",
741
+ "inputOptions": {
742
+ "target": "position_9f3e",
743
+ "pii": true,
744
+ "contactMapping": {
745
+ "contactField": "POSITION"
746
+ },
747
+ "inputType": "STRING",
748
+ "stringOptions": {
749
+ "validation": {},
750
+ "componentType": "TEXT_INPUT",
751
+ "textInputOptions": {
752
+ "label": "Current job title",
753
+ "showLabel": true
754
+ }
755
+ }
756
+ }
757
+ },
758
+ {
759
+ "id": "1d64b5c8-3e70-42a9-8b15-c9f207a4e631",
760
+ "identifier": "CONTACTS_TAX_ID",
761
+ "fieldType": "INPUT",
762
+ "inputOptions": {
763
+ "target": "tax_id_2b7d",
764
+ "pii": true,
765
+ "contactMapping": {
766
+ "contactField": "VAT_ID"
767
+ },
768
+ "inputType": "STRING",
769
+ "stringOptions": {
770
+ "validation": {},
771
+ "componentType": "TEXT_INPUT",
772
+ "textInputOptions": {
773
+ "label": "VAT or tax ID",
774
+ "showLabel": true
775
+ }
776
+ }
777
+ }
778
+ },
779
+ {
780
+ "id": "26ce91ce-8ee4-4aa6-2158-7169bcde9b32",
781
+ "identifier": "CONTACTS_BIRTHDATE",
782
+ "fieldType": "INPUT",
783
+ "inputOptions": {
784
+ "target": "birthdate_1808",
785
+ "pii": true,
786
+ "contactMapping": {
787
+ "contactField": "BIRTHDATE"
788
+ },
789
+ "inputType": "STRING",
790
+ "stringOptions": {
791
+ "validation": {
792
+ "format": "DATE"
793
+ },
794
+ "componentType": "DATE_INPUT",
795
+ "dateInputOptions": {
796
+ "label": "Date of birth",
797
+ "showLabel": true,
798
+ "showPlaceholder": false,
799
+ "showDateLabels": true
800
+ }
801
+ }
802
+ }
803
+ },
804
+ {
805
+ "id": "b6c64d1d-f759-40b7-f0ec-3e5cf20ec929",
806
+ "identifier": "CONTACTS_SUBSCRIBE",
807
+ "fieldType": "INPUT",
808
+ "inputOptions": {
809
+ "target": "subscribe_d888",
810
+ "contactMapping": {
811
+ "contactField": "SUBSCRIPTION",
812
+ "subscriptionInfo": {
813
+ "subscriptionChannels": [
814
+ "EMAIL"
815
+ ]
816
+ }
817
+ },
818
+ "inputType": "BOOLEAN",
819
+ "booleanOptions": {
820
+ "componentType": "CHECKBOX",
821
+ "checkboxOptions": {
822
+ "label": {
823
+ "nodes": [
824
+ {
825
+ "type": "PARAGRAPH",
826
+ "id": "u7g8s24",
827
+ "nodes": [
828
+ {
829
+ "type": "TEXT",
830
+ "id": "",
831
+ "nodes": [],
832
+ "textData": {
833
+ "text": "Yes, subscribe me to your newsletter.",
834
+ "decorations": []
835
+ }
836
+ }
837
+ ],
838
+ "paragraphData": {
839
+ "textStyle": {
840
+ "textAlignment": "AUTO"
841
+ }
842
+ }
843
+ }
844
+ ]
845
+ }
846
+ },
847
+ "validation": {}
848
+ }
849
+ }
850
+ },
851
+ {
852
+ "id": "2ad42412-8663-4b12-4104-05a65db8a4b1",
853
+ "identifier": "CONTACTS_ADDRESS",
854
+ "fieldType": "INPUT",
855
+ "inputOptions": {
856
+ "target": "delivery_address_d210",
857
+ "pii": true,
858
+ "required": true,
859
+ "contactMapping": {
860
+ "contactField": "ADDRESS",
861
+ "addressInfo": {
862
+ "tag": "UNTAGGED"
863
+ }
864
+ },
865
+ "inputType": "STRING",
866
+ "stringOptions": {
867
+ "validation": {},
868
+ "componentType": "TEXT_INPUT",
869
+ "textInputOptions": {
870
+ "label": "Delivery address",
871
+ "showLabel": true
872
+ }
873
+ }
874
+ }
875
+ },
876
+ {
877
+ "id": "eadbbac7-b883-463f-b205-9b8ffb03a4be",
878
+ "identifier": "MULTILINE_ADDRESS",
879
+ "fieldType": "INPUT",
880
+ "inputOptions": {
881
+ "target": "billing_address_bb91",
882
+ "pii": true,
883
+ "contactMapping": {
884
+ "contactField": "ADDRESS",
885
+ "addressInfo": {
886
+ "tag": "UNTAGGED"
887
+ }
888
+ },
889
+ "inputType": "ADDRESS",
890
+ "addressOptions": {
891
+ "validation": {
892
+ "fields": {
893
+ "country": {
894
+ "required": true
895
+ },
896
+ "addressLine": {
897
+ "required": true
898
+ },
899
+ "addressLine2": {
900
+ "required": false
901
+ },
902
+ "city": {
903
+ "required": true
904
+ },
905
+ "postalCode": {
906
+ "required": false
907
+ },
908
+ "subdivision": {
909
+ "required": false
910
+ },
911
+ "streetName": {
912
+ "required": false
913
+ },
914
+ "streetNumber": {
915
+ "required": false
916
+ }
917
+ }
918
+ },
919
+ "componentType": "MULTILINE_ADDRESS",
920
+ "multilineAddressOptions": {
921
+ "label": "Billing address",
922
+ "showLabel": true,
923
+ "autocompleteEnabled": false,
924
+ "fieldSettings": {
925
+ "addressLine2": {
926
+ "show": false
927
+ }
928
+ }
929
+ }
930
+ }
931
+ }
932
+ },
933
+ {
934
+ "id": "6051872d-a37d-4486-5138-e2dd6532cb21",
935
+ "identifier": "FILE_UPLOAD",
936
+ "fieldType": "INPUT",
937
+ "inputOptions": {
938
+ "target": "photo_id_2eae",
939
+ "required": true,
940
+ "inputType": "WIX_FILE",
941
+ "wixFileOptions": {
942
+ "componentType": "FILE_UPLOAD",
943
+ "validation": {
944
+ "uploadFileFormats": [
945
+ "IMAGE"
946
+ ],
947
+ "fileLimit": 1
948
+ },
949
+ "fileUploadOptions": {
950
+ "label": "Upload a photo ID",
951
+ "showLabel": true,
952
+ "buttonText": "Upload File",
953
+ "explanationText": "Image files only"
954
+ }
955
+ }
956
+ }
957
+ },
958
+ {
959
+ "id": "cba6b17a-b19c-4c9d-8e37-0e69cb17bbca",
960
+ "identifier": "SIGNATURE",
961
+ "fieldType": "INPUT",
962
+ "inputOptions": {
963
+ "target": "signature_3d48",
964
+ "pii": true,
965
+ "required": true,
966
+ "inputType": "WIX_FILE",
967
+ "wixFileOptions": {
968
+ "componentType": "SIGNATURE",
969
+ "validation": {
970
+ "uploadFileFormats": [
971
+ "IMAGE"
972
+ ],
973
+ "fileLimit": 1
974
+ },
975
+ "signatureOptions": {
976
+ "label": "Signature",
977
+ "showLabel": true,
978
+ "imageUploadEnabled": false
979
+ }
980
+ }
981
+ }
982
+ },
983
+ {
984
+ "id": "9d868f4b-bf4c-42da-c18e-72de43337033",
985
+ "identifier": "PRODUCT_LIST",
986
+ "fieldType": "INPUT",
987
+ "inputOptions": {
988
+ "target": "products_e817",
989
+ "inputType": "PAYMENT",
990
+ "paymentOptions": {
991
+ "componentType": "CHECKBOX_GROUP",
992
+ "validation": {
993
+ "products": [
994
+ {
995
+ "id": "db698a17-fa29-47a2-fb96-7b1dc75e2792",
996
+ "priceType": "FIXED_PRICE",
997
+ "productType": "DIGITAL",
998
+ "quantityLimit": {
999
+ "minimum": 1,
1000
+ "maximum": 1
1001
+ },
1002
+ "fixedPriceOptions": {
1003
+ "price": "25"
1004
+ }
1005
+ },
1006
+ {
1007
+ "id": "4f2c9a86-31be-4d70-8e15-6b0c73da29f4",
1008
+ "priceType": "FIXED_PRICE",
1009
+ "productType": "DIGITAL",
1010
+ "quantityLimit": {
1011
+ "minimum": 1,
1012
+ "maximum": 1
1013
+ },
1014
+ "fixedPriceOptions": {
1015
+ "price": "40"
1016
+ }
1017
+ }
1018
+ ]
1019
+ },
1020
+ "checkboxGroupOptions": {
1021
+ "label": "Choose your items",
1022
+ "showLabel": true,
1023
+ "options": [
1024
+ {
1025
+ "id": "e2a84fa5-8ed3-4feb-f30a-bb6c129d37ad",
1026
+ "label": "Digital guide",
1027
+ "value": "db698a17-fa29-47a2-fb96-7b1dc75e2792"
1028
+ },
1029
+ {
1030
+ "id": "8c317b40-95df-4e26-a103-2f6b8d047e59",
1031
+ "label": "Video course",
1032
+ "value": "4f2c9a86-31be-4d70-8e15-6b0c73da29f4"
1033
+ }
1034
+ ]
1035
+ }
1036
+ }
1037
+ }
1038
+ },
1039
+ {
1040
+ "id": "8f7023d6-eee0-4288-16c2-87a2aa2c990b",
1041
+ "identifier": "FIXED_PAYMENT",
1042
+ "fieldType": "INPUT",
1043
+ "inputOptions": {
1044
+ "target": "handling_fee_6abe",
1045
+ "required": true,
1046
+ "inputType": "PAYMENT",
1047
+ "paymentOptions": {
1048
+ "componentType": "FIXED_PAYMENT",
1049
+ "validation": {
1050
+ "products": [
1051
+ {
1052
+ "id": "e934c5cb-779c-40f1-f60f-ec58aa5a6657",
1053
+ "priceType": "FIXED_PRICE",
1054
+ "productType": "DIGITAL",
1055
+ "quantityLimit": {
1056
+ "minimum": 1,
1057
+ "maximum": 1
1058
+ },
1059
+ "fixedPriceOptions": {
1060
+ "price": "5"
1061
+ }
1062
+ }
1063
+ ]
1064
+ },
1065
+ "fixedPaymentOptions": {
1066
+ "label": "Handling fee",
1067
+ "showLabel": true
1068
+ }
1069
+ }
1070
+ }
1071
+ },
1072
+ {
1073
+ "id": "1f0a5c74-3e2b-4a91-8d67-0c5b9e2fa314",
1074
+ "fieldType": "INPUT",
1075
+ "identifier": "PAYMENT_INPUT",
1076
+ "inputOptions": {
1077
+ "target": "custom_amount_5c74",
1078
+ "inputType": "PAYMENT",
1079
+ "paymentOptions": {
1080
+ "componentType": "PAYMENT_INPUT",
1081
+ "validation": {
1082
+ "products": [
1083
+ {
1084
+ "id": "5b3d9f21-7c48-4e06-9a1d-8f2c4b70de95",
1085
+ "priceType": "DYNAMIC_PRICE",
1086
+ "productType": "DIGITAL",
1087
+ "quantityLimit": {
1088
+ "minimum": 1,
1089
+ "maximum": 1
1090
+ },
1091
+ "dynamicPriceOptions": {
1092
+ "minPrice": "5"
1093
+ }
1094
+ }
1095
+ ]
1096
+ },
1097
+ "paymentInputOptions": {
1098
+ "label": "Amount",
1099
+ "showLabel": true
1100
+ }
1101
+ }
1102
+ }
1103
+ },
1104
+ {
1105
+ "id": "b7e7755e-fe11-4546-c29d-20d51007b164",
1106
+ "fieldType": "INPUT",
1107
+ "identifier": "DONATION",
1108
+ "inputOptions": {
1109
+ "target": "donation_4dee",
1110
+ "inputType": "PAYMENT",
1111
+ "paymentOptions": {
1112
+ "componentType": "DONATION_INPUT",
1113
+ "validation": {
1114
+ "products": [
1115
+ {
1116
+ "id": "b66b1c6c-ec2e-4a69-abb9-37d6bbacc706",
1117
+ "priceType": "FIXED_PRICE",
1118
+ "productType": "DIGITAL",
1119
+ "quantityLimit": {
1120
+ "minimum": 1,
1121
+ "maximum": 1
1122
+ },
1123
+ "fixedPriceOptions": {
1124
+ "price": "10"
1125
+ }
1126
+ },
1127
+ {
1128
+ "id": "df5faf1a-4b00-4e94-0b64-b4b1f94fc09a",
1129
+ "priceType": "FIXED_PRICE",
1130
+ "productType": "DIGITAL",
1131
+ "quantityLimit": {
1132
+ "minimum": 1,
1133
+ "maximum": 1
1134
+ },
1135
+ "fixedPriceOptions": {
1136
+ "price": "20"
1137
+ }
1138
+ }
1139
+ ]
1140
+ },
1141
+ "donationInputOptions": {
1142
+ "label": "Donation",
1143
+ "showLabel": true,
1144
+ "numberOfColumns": "THREE",
1145
+ "options": [
1146
+ {
1147
+ "value": "b66b1c6c-ec2e-4a69-abb9-37d6bbacc706"
1148
+ },
1149
+ {
1150
+ "value": "df5faf1a-4b00-4e94-0b64-b4b1f94fc09a"
1151
+ }
1152
+ ]
1153
+ }
1154
+ }
1155
+ }
1156
+ },
1157
+ {
1158
+ "id": "218260f0-e9b3-4aee-2aed-267cd8f6460f",
1159
+ "identifier": "APPOINTMENT",
1160
+ "fieldType": "INPUT",
1161
+ "inputOptions": {
1162
+ "target": "consultation_4146",
1163
+ "inputType": "SCHEDULING",
1164
+ "schedulingOptions": {
1165
+ "componentType": "APPOINTMENT",
1166
+ "appointmentOptions": {
1167
+ "label": "Pick a time for your consultation",
1168
+ "showLabel": true,
1169
+ "name": "Consultation",
1170
+ "durationInMinutes": 30,
1171
+ "staffIds": [
1172
+ "8cd69332-ea08-45a1-8333-526b623bcec2"
1173
+ ],
1174
+ "manualApprovalRequired": false,
1175
+ "format": "PHONE",
1176
+ "phoneOptions": {
1177
+ "description": "Phone call"
1178
+ }
1179
+ }
1180
+ }
1181
+ }
1182
+ },
1183
+ {
1184
+ "id": "ca7a4f22-31fa-40d3-635b-baad47d53344",
1185
+ "identifier": "SERVICES_DROPDOWN",
1186
+ "fieldType": "INPUT",
1187
+ "inputOptions": {
1188
+ "target": "service_7374",
1189
+ "inputType": "STRING",
1190
+ "stringOptions": {
1191
+ "validation": {
1192
+ "enum": [
1193
+ "ecadb257-0be6-4011-a575-a17d2232e278"
1194
+ ]
1195
+ },
1196
+ "componentType": "SERVICES_DROPDOWN",
1197
+ "servicesDropdownOptions": {
1198
+ "label": "Choose a service",
1199
+ "showLabel": true,
1200
+ "placeholder": "Select a service",
1201
+ "options": [
1202
+ {
1203
+ "id": "ecadb257-0be6-4011-a575-a17d2232e278",
1204
+ "label": "Initial consultation",
1205
+ "value": "ecadb257-0be6-4011-a575-a17d2232e278"
1206
+ }
1207
+ ]
1208
+ }
1209
+ }
1210
+ }
1211
+ },
1212
+ {
1213
+ "id": "02ecf77a-018c-4bb5-202c-58c9e2bb87b2",
1214
+ "identifier": "SERVICES_MULTI_CHOICE",
1215
+ "fieldType": "INPUT",
1216
+ "inputOptions": {
1217
+ "target": "add_ons_406f",
1218
+ "inputType": "ARRAY",
1219
+ "arrayOptions": {
1220
+ "validation": {
1221
+ "items": {
1222
+ "itemType": "STRING",
1223
+ "stringOptions": {
1224
+ "enum": [
1225
+ "7d19f3a5-4c82-4e06-b573-91a0dc2e685f"
1226
+ ]
1227
+ }
1228
+ }
1229
+ },
1230
+ "componentType": "SERVICES_CHECKBOX_GROUP",
1231
+ "servicesCheckboxGroupOptions": {
1232
+ "label": "Add-on services",
1233
+ "showLabel": true,
1234
+ "numberOfColumns": "ONE",
1235
+ "options": [
1236
+ {
1237
+ "id": "7d19f3a5-4c82-4e06-b573-91a0dc2e685f",
1238
+ "label": "Follow-up session",
1239
+ "value": "7d19f3a5-4c82-4e06-b573-91a0dc2e685f"
1240
+ }
1241
+ ]
1242
+ }
1243
+ }
1244
+ }
1245
+ },
1246
+ {
1247
+ "id": "9e5b1c73-2f48-4a06-b91d-73c0e8452fa1",
1248
+ "identifier": "RICH_TEXT",
1249
+ "fieldType": "DISPLAY",
1250
+ "displayOptions": {
1251
+ "displayFieldType": "RICH_CONTENT",
1252
+ "richContentOptions": {
1253
+ "richContent": {
1254
+ "nodes": [
1255
+ {
1256
+ "type": "PARAGRAPH",
1257
+ "id": "wvr3b41",
1258
+ "nodes": [
1259
+ {
1260
+ "type": "TEXT",
1261
+ "id": "",
1262
+ "nodes": [],
1263
+ "textData": {
1264
+ "text": "I confirm that I am participating voluntarily and accept the risks involved.",
1265
+ "decorations": []
1266
+ }
1267
+ }
1268
+ ],
1269
+ "paragraphData": {
1270
+ "textStyle": {
1271
+ "textAlignment": "AUTO"
1272
+ }
1273
+ }
1274
+ }
1275
+ ]
1276
+ }
1277
+ }
1278
+ }
1279
+ },
1280
+ {
1281
+ "id": "2e56791e-926e-48fd-37d0-0ad60a27736d",
1282
+ "identifier": "SUBMIT_BUTTON",
1283
+ "fieldType": "DISPLAY",
1284
+ "displayOptions": {
1285
+ "displayFieldType": "PAGE_NAVIGATION",
1286
+ "pageNavigationOptions": {
1287
+ "submitText": "Pay"
1288
+ }
1289
+ }
1290
+ }
1291
+ ],
1292
+ "steps": [
1293
+ {
1294
+ "id": "0f0e6cfd-3e1a-4a1e-9a3a-4e2b5c6d7e8f",
1295
+ "name": "Page 1",
1296
+ "layout": {
1297
+ "large": {
1298
+ "items": [
1299
+ {
1300
+ "fieldId": "4add0e51-a168-4ab6-76ff-834d782fb4d9",
1301
+ "row": 0,
1302
+ "column": 0,
1303
+ "width": 12,
1304
+ "height": 1
1305
+ },
1306
+ {
1307
+ "fieldId": "bbecbd37-ca52-4fa6-a92c-90e70aa4ec2a",
1308
+ "row": 1,
1309
+ "column": 0,
1310
+ "width": 12,
1311
+ "height": 1
1312
+ },
1313
+ {
1314
+ "fieldId": "7e2a15c8-0b34-49df-86a1-c40f9d73e526",
1315
+ "row": 2,
1316
+ "column": 0,
1317
+ "width": 12,
1318
+ "height": 1
1319
+ },
1320
+ {
1321
+ "fieldId": "a5f82c31-7d09-4e6b-b384-0c15fe739a2d",
1322
+ "row": 3,
1323
+ "column": 0,
1324
+ "width": 12,
1325
+ "height": 1
1326
+ },
1327
+ {
1328
+ "fieldId": "4913d7ab-352a-481b-831f-ee8beb895b64",
1329
+ "row": 4,
1330
+ "column": 0,
1331
+ "width": 12,
1332
+ "height": 1
1333
+ },
1334
+ {
1335
+ "fieldId": "a0d72e94-6f18-4c3b-85d0-e21739bc6a48",
1336
+ "row": 5,
1337
+ "column": 0,
1338
+ "width": 12,
1339
+ "height": 1
1340
+ },
1341
+ {
1342
+ "fieldId": "3b6d9e21-84c7-4f05-a913-2e7d0c5b48f1",
1343
+ "row": 6,
1344
+ "column": 0,
1345
+ "width": 12,
1346
+ "height": 1
1347
+ },
1348
+ {
1349
+ "fieldId": "50de5707-06aa-49e7-ba63-cabf0b8bc7e2",
1350
+ "row": 7,
1351
+ "column": 0,
1352
+ "width": 12,
1353
+ "height": 1
1354
+ },
1355
+ {
1356
+ "fieldId": "7fe8d8a5-6075-4c81-6678-662fe3ca48e4",
1357
+ "row": 8,
1358
+ "column": 0,
1359
+ "width": 12,
1360
+ "height": 1
1361
+ },
1362
+ {
1363
+ "fieldId": "8c5b3d47-e109-42fa-b6c8-71e4a03f9d52",
1364
+ "row": 9,
1365
+ "column": 0,
1366
+ "width": 12,
1367
+ "height": 1
1368
+ },
1369
+ {
1370
+ "fieldId": "d419f6b0-5c82-4e17-93ad-6f108b2c7e34",
1371
+ "row": 10,
1372
+ "column": 0,
1373
+ "width": 12,
1374
+ "height": 1
1375
+ },
1376
+ {
1377
+ "fieldId": "62e0c8f5-9a34-4d61-b7fe-05c9138d24a7",
1378
+ "row": 11,
1379
+ "column": 0,
1380
+ "width": 12,
1381
+ "height": 1
1382
+ },
1383
+ {
1384
+ "fieldId": "76976adf-3cc4-453e-863b-577cbb619a45",
1385
+ "row": 12,
1386
+ "column": 0,
1387
+ "width": 12,
1388
+ "height": 1
1389
+ },
1390
+ {
1391
+ "fieldId": "b7c4bc3b-62a7-4746-33bd-c6d46e39ce33",
1392
+ "row": 13,
1393
+ "column": 0,
1394
+ "width": 12,
1395
+ "height": 1
1396
+ },
1397
+ {
1398
+ "fieldId": "15fa8e6c-3d71-4b09-a2e5-9c86d4170fb3",
1399
+ "row": 14,
1400
+ "column": 0,
1401
+ "width": 12,
1402
+ "height": 1
1403
+ },
1404
+ {
1405
+ "fieldId": "905345fa-e7fe-44c0-e114-4999a6e89f79",
1406
+ "row": 15,
1407
+ "column": 0,
1408
+ "width": 12,
1409
+ "height": 1
1410
+ },
1411
+ {
1412
+ "fieldId": "d7665e98-a7c4-4829-c104-fb856883e043",
1413
+ "row": 16,
1414
+ "column": 0,
1415
+ "width": 12,
1416
+ "height": 1
1417
+ },
1418
+ {
1419
+ "fieldId": "740e294e-6ee4-4cda-c902-823002064985",
1420
+ "row": 17,
1421
+ "column": 0,
1422
+ "width": 12,
1423
+ "height": 1
1424
+ },
1425
+ {
1426
+ "fieldId": "19768973-65be-4a6f-b3de-57cfb1da48db",
1427
+ "row": 18,
1428
+ "column": 0,
1429
+ "width": 12,
1430
+ "height": 1
1431
+ },
1432
+ {
1433
+ "fieldId": "95d528a8-8f3d-4692-7363-44db1f96ca18",
1434
+ "row": 19,
1435
+ "column": 0,
1436
+ "width": 12,
1437
+ "height": 1
1438
+ },
1439
+ {
1440
+ "fieldId": "7b21e4d6-0a93-4c58-8f37-15d0ba69c284",
1441
+ "row": 20,
1442
+ "column": 0,
1443
+ "width": 12,
1444
+ "height": 1
1445
+ },
1446
+ {
1447
+ "fieldId": "e8d3f907-b26a-4715-9c04-3a7e15bd6f82",
1448
+ "row": 21,
1449
+ "column": 0,
1450
+ "width": 12,
1451
+ "height": 1
1452
+ },
1453
+ {
1454
+ "fieldId": "1d64b5c8-3e70-42a9-8b15-c9f207a4e631",
1455
+ "row": 22,
1456
+ "column": 0,
1457
+ "width": 12,
1458
+ "height": 1
1459
+ },
1460
+ {
1461
+ "fieldId": "26ce91ce-8ee4-4aa6-2158-7169bcde9b32",
1462
+ "row": 23,
1463
+ "column": 0,
1464
+ "width": 12,
1465
+ "height": 1
1466
+ },
1467
+ {
1468
+ "fieldId": "b6c64d1d-f759-40b7-f0ec-3e5cf20ec929",
1469
+ "row": 24,
1470
+ "column": 0,
1471
+ "width": 12,
1472
+ "height": 1
1473
+ },
1474
+ {
1475
+ "fieldId": "2ad42412-8663-4b12-4104-05a65db8a4b1",
1476
+ "row": 25,
1477
+ "column": 0,
1478
+ "width": 12,
1479
+ "height": 1
1480
+ },
1481
+ {
1482
+ "fieldId": "eadbbac7-b883-463f-b205-9b8ffb03a4be",
1483
+ "row": 26,
1484
+ "column": 0,
1485
+ "width": 12,
1486
+ "height": 1
1487
+ },
1488
+ {
1489
+ "fieldId": "6051872d-a37d-4486-5138-e2dd6532cb21",
1490
+ "row": 27,
1491
+ "column": 0,
1492
+ "width": 12,
1493
+ "height": 1
1494
+ },
1495
+ {
1496
+ "fieldId": "cba6b17a-b19c-4c9d-8e37-0e69cb17bbca",
1497
+ "row": 28,
1498
+ "column": 0,
1499
+ "width": 12,
1500
+ "height": 1
1501
+ },
1502
+ {
1503
+ "fieldId": "9d868f4b-bf4c-42da-c18e-72de43337033",
1504
+ "row": 29,
1505
+ "column": 0,
1506
+ "width": 12,
1507
+ "height": 1
1508
+ },
1509
+ {
1510
+ "fieldId": "8f7023d6-eee0-4288-16c2-87a2aa2c990b",
1511
+ "row": 30,
1512
+ "column": 0,
1513
+ "width": 12,
1514
+ "height": 1
1515
+ },
1516
+ {
1517
+ "fieldId": "1f0a5c74-3e2b-4a91-8d67-0c5b9e2fa314",
1518
+ "row": 31,
1519
+ "column": 0,
1520
+ "width": 12,
1521
+ "height": 1
1522
+ },
1523
+ {
1524
+ "fieldId": "b7e7755e-fe11-4546-c29d-20d51007b164",
1525
+ "row": 32,
1526
+ "column": 0,
1527
+ "width": 12,
1528
+ "height": 1
1529
+ },
1530
+ {
1531
+ "fieldId": "218260f0-e9b3-4aee-2aed-267cd8f6460f",
1532
+ "row": 33,
1533
+ "column": 0,
1534
+ "width": 12,
1535
+ "height": 1
1536
+ },
1537
+ {
1538
+ "fieldId": "ca7a4f22-31fa-40d3-635b-baad47d53344",
1539
+ "row": 34,
1540
+ "column": 0,
1541
+ "width": 12,
1542
+ "height": 1
1543
+ },
1544
+ {
1545
+ "fieldId": "02ecf77a-018c-4bb5-202c-58c9e2bb87b2",
1546
+ "row": 35,
1547
+ "column": 0,
1548
+ "width": 12,
1549
+ "height": 1
1550
+ },
1551
+ {
1552
+ "fieldId": "9e5b1c73-2f48-4a06-b91d-73c0e8452fa1",
1553
+ "row": 36,
1554
+ "column": 0,
1555
+ "width": 12,
1556
+ "height": 1
1557
+ },
1558
+ {
1559
+ "fieldId": "2e56791e-926e-48fd-37d0-0ad60a27736d",
1560
+ "row": 37,
1561
+ "column": 0,
1562
+ "width": 12,
1563
+ "height": 1
1564
+ }
1565
+ ]
1566
+ }
1567
+ }
1568
+ }
1569
+ ]
1570
+ }
1571
+ }
1572
+ ```
1573
+
1574
+ ## 4 · Create the form
1575
+
1576
+ One POST per form body, to the **Form Schemas v4** endpoint — a **CRM** API, not Business Solutions,
1577
+ always on the public host, never `/_api/`:
1578
+
1579
+ ```
1580
+ POST https://www.wixapis.com/form-schema-service/v4/forms
1581
+ { "form": { … the body from step 3 … } }
1582
+ ```
1583
+
1584
+ Read **`form.id`** from the response — that's the `formId` the rest of the run carries. **Record it
1585
+ the moment it comes back**, before anything else: it is the only way a later attempt can tell a form
1586
+ this run created from one the owner already had. Forms are independent (no shared revision), so
1587
+ create them in any order.
1588
+
1589
+ **Three things to check before you POST.** The API accepts the first two and loses the field; the
1590
+ third leaves you with a second form:
1591
+
1592
+ - the body has at least one `INPUT` field — a form of nothing but a submit button collects nothing;
1593
+ - **no two fields share a `target`**. The server keeps one; every other field with that key silently
1594
+ stores nothing.
1595
+ - **no form of this name exists yet** —
1596
+ `GET https://www.wixapis.com/form-schema-service/v4/forms?namespace=wix.form_app.form`, comparing
1597
+ `name` exactly. Wix does **not** reject a duplicate name; it silently appends a counter (`"Contact"`
1598
+ → `"Contact 1"`), so create is **not idempotent** and nothing tells you a retry duplicated a form.
1599
+ A name matching a form **this run** created (per the id you recorded above) → reuse that `formId`
1600
+ rather than creating again. A name you have no record of creating is the **owner's**: additive
1601
+ only, so leave it alone and pick a different name or ask.
1602
+
1603
+ An orphan *you* created in this run is yours to clear — `DELETE .../v4/forms/<formId>` is a soft
1604
+ delete to the trash bin, so it is recoverable. Anything you did not create stays untouched.
1605
+
1606
+ **A `200` here proves almost nothing.** Most mistakes in a form body are accepted at create and
1607
+ surface only in the owner's dashboard or on the first real submission — step 5 is what actually
1608
+ proves the form works. Two failures worth recognizing before you retry:
1609
+
1610
+ - A transient `5xx`, an identity/propagation error right after install, or a timeout leaves you not
1611
+ knowing whether the create landed. **Re-list by name before retrying** — never blind-retry the
1612
+ POST, because the duplicate it may create is silent. One retry once the list comes back empty;
1613
+ never a loop.
1614
+ - **Plan gates are a hard block, not a note-and-continue.** `FIELDS_COUNT_RESTRICTIONS_ERROR`
1615
+ (per-form field cap), `FILE_UPLOAD_RESTRICTIONS_ERROR` (upload/signature/payment below Core) and
1616
+ `FORMS_COUNT_RESTRICTIONS_ERROR` (site form cap) each mean **reduce or upgrade** — put the choice
1617
+ to the user with their dashboard link and wait for an answer. Never split a form across schemas to
1618
+ dodge the field cap, never inline a file as base64, and never create throwaway forms to probe the
1619
+ shape.
1620
+
1621
+ **The field cap cannot be read in advance.** `listFormsProvidersConfigs` reports the Forms app's
1622
+ ceiling, not the site's plan cap — on a free site it returns `maxFields: 150` while the create is
1623
+ rejected with `"Field count reached its limit of 10"`. The cap is per plan, not per app. Treat the
1624
+ create as the only authority on the number: budget conservatively while authoring step 3 rather
1625
+ than discovering the limit after a full authoring pass, and count every entry in `formFields`, the
1626
+ `SUBMIT_BUTTON` included.
1627
+
1628
+ **Revising a form later** — add a field, relabel one, tighten a rule:
1629
+
1630
+ ```
1631
+ PATCH https://www.wixapis.com/form-schema-service/v4/forms/<formId>
1632
+ { "form": { …, "revision": "<the form's current revision>" } }
1633
+ ```
1634
+
1635
+ Never delete-and-recreate: a `PATCH` keeps the `formId` the UI already holds and spends no extra slot
1636
+ against the site's form cap. Re-run step 5 afterwards — an update regresses a layout exactly as a
1637
+ create can.
1638
+
1639
+ ## 5 · Verify it works
1640
+
1641
+ **All four calls are yours to make**, and the last one needs a submission you compose from *this*
1642
+ form's schema. All four use the standard headers from step 1.
1643
+
1644
+ **A `200` on create means the body parsed — nothing more.** Every mistake below returns `200` and
1645
+ surfaces only in the owner's dashboard or on the first real submission.
1646
+
1647
+ ### 5a · Read the form back
1648
+
1649
+ ```
1650
+ GET https://www.wixapis.com/form-schema-service/v4/forms?namespace=wix.form_app.form&formIds=<formId>
1651
+ ```
1652
+
1653
+ `formIds` narrows the listing to exactly what you created, so you assert against it directly. Then,
1654
+ against the returned `form.formFields`:
1655
+
1656
+ - **Every `target` you sent is there.** One that isn't means the field didn't persist — usually an
1657
+ `identifier` Wix doesn't recognize, which is dropped without an error.
1658
+ - **Every `inputOptions.required` reads back as you sent it.** A `required` key placed inside a
1659
+ validation block is accepted and then discarded, so the form ships with nothing mandatory. This
1660
+ diff is the only signal you will ever get.
1661
+ - **Every choice field is still a choice field.** For each `DROPDOWN` / `RADIO_GROUP` /
1662
+ `CHECKBOX_GROUP` / `TAGS` you sent, assert the read-back still carries that `componentType`, that
1663
+ its `options[]` is non-empty, and that it agrees with the validation `enum`. A malformed options
1664
+ block is accepted at create and comes back as a plain text input — `target` intact, `required`
1665
+ intact — so every other check in step 5 passes and the field silently loses its choices.
1666
+ - **Keep the read-back `target`s.** These, not the ones you authored, are what goes into step 6.
1667
+
1668
+ ### 5b · Check the dashboard view
1669
+
1670
+ ```
1671
+ GET https://www.wixapis.com/form-schema-service/v4/forms/<formId>/summary
1672
+ ```
1673
+
1674
+ Assert `formSummary.fields` is **non-empty**, with one entry per input field you sent (everything in
1675
+ `formFields` except the `SUBMIT_BUTTON`). The summary is exactly what the Wix dashboard renders, so a
1676
+ short or empty count means the form is blank — or partly blank — **for the owner**, even while the
1677
+ public site submits fine. Non-contact fields count too; don't expect only the contact-mapped ones.
1678
+
1679
+ ### 5c · Submit to it once, for real
1680
+
1681
+ This is the check the other two can't stand in for. An ARRAY field whose `validation.items` is
1682
+ missing `itemType` passes 5a and 5b and then `400`s **form-wide** — every field, every visitor.
1683
+ Submitting once is the only proof the form can receive data at all.
1684
+
1685
+ **What it does not catch:** a STRING choice field does **not** enforce its `validation.enum` on
1686
+ submit. A dropdown whose enum and options both read back correctly still accepts `"Not an option"`
1687
+ with a `200`. So the probe proves the form *receives* data; it will not tell you a choice field's
1688
+ two declarations have drifted apart. Get those right in step 3 — nothing downstream will catch it
1689
+ for you.
1690
+
1691
+ ```
1692
+ POST https://www.wixapis.com/form-submission-service/v4/submissions
1693
+ { "submission": { "formId": "<formId>", "submissions": { "<target>": <value> } } }
1694
+ ```
1695
+
1696
+ **Rules for composing `submissions`** — get one wrong and the whole submission fails, not just that
1697
+ value:
1698
+
1699
+ - **Keys are field `target`s from the 5a read-back.** Never a label, never a field `id`. A key that
1700
+ isn't a target in the schema fails the entire submission.
1701
+ - **Include every `required` field** — the server rejects the submission without them — **plus every
1702
+ ARRAY field whether required or not**, since the ARRAY shape is the thing you're testing.
1703
+ - **The value's shape follows the field's `inputType`, not its component:**
1704
+
1705
+ | `inputType` | value | example |
1706
+ |---|---|---|
1707
+ | `STRING` | a string, formatted per `validation.format` | `"seed-probe@example.com"`, `"2030-01-01"`, `"10:00:00"` |
1708
+ | `NUMBER` | a number | `1` |
1709
+ | `BOOLEAN` | a boolean | `true` |
1710
+ | `ARRAY` | an array of **option values** | `["Option 1"]` |
1711
+ | `ADDRESS` | an object, only the subfields the form shows | `{"country":"US","subdivision":"US-NY","city":"New York","postalCode":"10011","addressLine":"235 West 23rd Street"}` |
1712
+ | `PAYMENT` | an array of `{productId, price, quantity}` | `[{"productId":"<from validation.products>","price":"25","quantity":1}]` |
1713
+ | `SCHEDULING` | `{startDate, endDate, timeZone}` | `{"startDate":"2030-07-02T14:00:00","endDate":"2030-07-02T14:30:00","timeZone":"America/New_York"}` |
1714
+
1715
+ - **Use one of the field's own option `value`s** — copy it from the schema rather than retyping the
1716
+ label. The server won't reject a value outside the enum (see above), so a typo here quietly proves
1717
+ nothing.
1718
+ - **`country` and `subdivision` are validated against each other**, so send a matching pair or omit
1719
+ `subdivision`.
1720
+ - **A `WIX_FILE` field can't be faked.** If a file upload or signature is `required`, this check
1721
+ can't run — say so and have the user submit once through the published site instead of recording a
1722
+ pass that never happened.
1723
+
1724
+ Assert `200`. A **`400 SUBMISSION_VALIDATION` is a schema bug, not a submission bug** — fix the form
1725
+ body and re-create it; never bend the value to get through. The error names the field and the reason
1726
+ under `details.validationError.fieldViolations[].data.errors[]`, each with an `errorPath` (the
1727
+ `target`) and an `errorType` — `UNKNOWN_VALUE_ERROR` means the key isn't a `target` in this form.
1728
+
1729
+ ### 5d · Delete the test submission
1730
+
1731
+ ```
1732
+ DELETE https://www.wixapis.com/form-submission-service/v4/submissions/<id>
1733
+ ```
1734
+
1735
+ The id comes from the 5c response as **`submission.id`**: REST returns `id`, not the `_id` the
1736
+ reference schema shows (that's the SDK's shape). Do this every time — the owner's inbox is a real
1737
+ business inbox, and a probe left in it looks like a real enquiry. If a probe ever escapes, find it
1738
+ with `POST /form-submission-service/v4/submissions/namespace/query` filtered by `formId` +
1739
+ `namespace`.
1740
+
1741
+ ## 6 · Hand off
1742
+
1743
+ Only once step 5 has passed for every form, write `src/rest/wix-forms.config.js` — one entry per
1744
+ form, keyed by the form's name lowercased with each run of non-alphanumerics collapsed to a single
1745
+ `_` (`"Quote request"` → `quote_request`):
1746
+
1747
+ ```js
1748
+ // Written by the seed run once step 5 passed. Do not hand-edit, and do not create it early:
1749
+ // its existence is what proves the form schemas were created AND verified.
1750
+ export const WIX_FORMS = {
1751
+ contact: { formId: "…", name: "Contact", targets: { email: true, message: true } },
1752
+ };
1753
+ ```
1754
+
1755
+ **That file is the handoff, and the gate.** The UI imports `WIX_FORMS` from it; no file means the
1756
+ seed did not succeed, so nothing may be built against the form yet. So **never write it before step 5
1757
+ passes**, and never invent a `formId`. If the app's `src/` layout puts its REST layer elsewhere, write
1758
+ it there instead — the path matters less than the file existing before the UI step.
1759
+
1760
+ `targets` is the **read-back** map of immutable submission keys — the one from 5a, not the one you
1761
+ authored in step 3. Everything else — labels, order, options, validation — the client reads **live
1762
+ from the schema**, so an owner's dashboard edit shows on the site with no code change.