@jskit-ai/connectors-catalog 0.1.1

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 (399) hide show
  1. package/README.md +192 -0
  2. package/docs/ai-upstream-notices.md +51 -0
  3. package/docs/ai.md +191 -0
  4. package/docs/airtable.md +130 -0
  5. package/docs/algolia.md +190 -0
  6. package/docs/amazon-redshift.md +229 -0
  7. package/docs/amplitude.md +210 -0
  8. package/docs/apify.md +162 -0
  9. package/docs/apollo-io.md +200 -0
  10. package/docs/asana.md +126 -0
  11. package/docs/ashby.md +188 -0
  12. package/docs/atlassian.md +224 -0
  13. package/docs/attention.md +162 -0
  14. package/docs/aws-athena.md +150 -0
  15. package/docs/aws-credentials.md +75 -0
  16. package/docs/aws-s3.md +193 -0
  17. package/docs/bigquery.md +146 -0
  18. package/docs/brevo.md +122 -0
  19. package/docs/calendly.md +158 -0
  20. package/docs/canva.md +191 -0
  21. package/docs/chargebee.md +192 -0
  22. package/docs/clay.md +194 -0
  23. package/docs/clickhouse.md +242 -0
  24. package/docs/confidence-exp.md +74 -0
  25. package/docs/confidence-flags.md +75 -0
  26. package/docs/confidence-oauth.md +137 -0
  27. package/docs/contentful.md +123 -0
  28. package/docs/databricks.md +180 -0
  29. package/docs/dbt-semantic-layer.md +175 -0
  30. package/docs/elevenlabs.md +102 -0
  31. package/docs/figma.md +132 -0
  32. package/docs/firebase-cloud-messaging.md +262 -0
  33. package/docs/firecrawl.md +137 -0
  34. package/docs/fireflies.md +95 -0
  35. package/docs/fireworks-ai.md +53 -0
  36. package/docs/gatewayapi.md +113 -0
  37. package/docs/gemini-enterprise.md +224 -0
  38. package/docs/github-api.md +133 -0
  39. package/docs/gitlab-api.md +138 -0
  40. package/docs/gmail.md +133 -0
  41. package/docs/gong.md +205 -0
  42. package/docs/google-ads.md +156 -0
  43. package/docs/google-analytics.md +202 -0
  44. package/docs/google-docs.md +105 -0
  45. package/docs/google-drive.md +108 -0
  46. package/docs/google-maps-platform.md +208 -0
  47. package/docs/google-oauth.md +123 -0
  48. package/docs/google-search-console.md +124 -0
  49. package/docs/google-sheets.md +94 -0
  50. package/docs/google-slides.md +95 -0
  51. package/docs/granola.md +178 -0
  52. package/docs/hex.md +161 -0
  53. package/docs/heygen.md +124 -0
  54. package/docs/hubspot.md +142 -0
  55. package/docs/incident-io.md +118 -0
  56. package/docs/inngest.md +178 -0
  57. package/docs/klipy.md +149 -0
  58. package/docs/lexware.md +144 -0
  59. package/docs/lightspeed.md +193 -0
  60. package/docs/linear.md +137 -0
  61. package/docs/linkedin.md +196 -0
  62. package/docs/logo-dev.md +152 -0
  63. package/docs/mailgun.md +153 -0
  64. package/docs/mapbox.md +174 -0
  65. package/docs/microsoft-excel.md +97 -0
  66. package/docs/microsoft-fabric.md +249 -0
  67. package/docs/microsoft-oauth.md +143 -0
  68. package/docs/microsoft-onedrive.md +76 -0
  69. package/docs/microsoft-onenote.md +75 -0
  70. package/docs/microsoft-outlook.md +90 -0
  71. package/docs/microsoft-powerpoint.md +119 -0
  72. package/docs/microsoft-sharepoint.md +75 -0
  73. package/docs/microsoft-teams.md +72 -0
  74. package/docs/microsoft-word.md +119 -0
  75. package/docs/miro.md +117 -0
  76. package/docs/n8n.md +169 -0
  77. package/docs/notion.md +137 -0
  78. package/docs/oura.md +161 -0
  79. package/docs/paddle.md +168 -0
  80. package/docs/perplexity.md +85 -0
  81. package/docs/pipedrive.md +120 -0
  82. package/docs/polar.md +63 -0
  83. package/docs/posthog.md +227 -0
  84. package/docs/prestashop.md +151 -0
  85. package/docs/replicate.md +60 -0
  86. package/docs/resend.md +153 -0
  87. package/docs/salesforce.md +234 -0
  88. package/docs/sanity.md +122 -0
  89. package/docs/semrush.md +276 -0
  90. package/docs/sentry.md +112 -0
  91. package/docs/sevdesk.md +107 -0
  92. package/docs/shopify.md +206 -0
  93. package/docs/slack.md +257 -0
  94. package/docs/snowflake.md +271 -0
  95. package/docs/storyblok.md +130 -0
  96. package/docs/stripe.md +77 -0
  97. package/docs/supabase.md +51 -0
  98. package/docs/tally.md +105 -0
  99. package/docs/telegram.md +165 -0
  100. package/docs/tiktok.md +201 -0
  101. package/docs/twilio.md +284 -0
  102. package/docs/twitch.md +428 -0
  103. package/docs/wave.md +440 -0
  104. package/docs/wix.md +1249 -0
  105. package/docs/wiz.md +177 -0
  106. package/docs/woocommerce.md +400 -0
  107. package/docs/wordpress-com.md +358 -0
  108. package/docs/wordpress-self-hosted.md +252 -0
  109. package/docs/workday.md +292 -0
  110. package/docs/x-twitter.md +188 -0
  111. package/docs/xero.md +429 -0
  112. package/docs/zoho-books.md +214 -0
  113. package/docs/zoho-crm.md +192 -0
  114. package/package.json +153 -0
  115. package/patterns/ai-connections/PATTERN.md +84 -0
  116. package/patterns/ai-connections/example/ai-model.js +11 -0
  117. package/patterns/ai-connections/example/perplexity-answer.js +29 -0
  118. package/patterns/api-key-connection/PATTERN.md +368 -0
  119. package/patterns/api-key-connection/example/connections.js +18 -0
  120. package/patterns/api-key-connection/example/integrations.json +19 -0
  121. package/patterns/assistant-mcp/PATTERN.md +110 -0
  122. package/patterns/assistant-mcp/example/integrations.json +13 -0
  123. package/patterns/assistant-mcp-oauth/PATTERN.md +235 -0
  124. package/patterns/assistant-mcp-oauth/example/integrations.json +102 -0
  125. package/patterns/aws-storage-queries/PATTERN.md +169 -0
  126. package/patterns/aws-storage-queries/example/formats/data-formats.js +35 -0
  127. package/patterns/aws-storage-queries/example/formats/package-lock.json +49 -0
  128. package/patterns/aws-storage-queries/example/formats/package.json +12 -0
  129. package/patterns/aws-storage-queries/example/formats/verify-formats.mjs +37 -0
  130. package/patterns/aws-storage-queries/example/integrations.json +38 -0
  131. package/patterns/aws-storage-queries/example/s3-transfer.js +34 -0
  132. package/patterns/event-delivery/PATTERN.md +151 -0
  133. package/patterns/event-delivery/example/integrations.json +17 -0
  134. package/patterns/firebase-messaging/PATTERN.md +156 -0
  135. package/patterns/firebase-messaging/example/server/notifications.js +23 -0
  136. package/patterns/google-ads-search/PATTERN.md +92 -0
  137. package/patterns/google-ads-search/example/ads-setup.js +25 -0
  138. package/patterns/oauth-connection/PATTERN.md +724 -0
  139. package/patterns/oauth-connection/example/integrations.json +20 -0
  140. package/patterns/paddle-catalogue/PATTERN.md +78 -0
  141. package/patterns/paddle-catalogue/example/create-products.js +38 -0
  142. package/patterns/public-image/PATTERN.md +84 -0
  143. package/patterns/public-image/example/integrations.json +13 -0
  144. package/patterns/public-image/example/logo-url.js +16 -0
  145. package/patterns/redshift-queries/PATTERN.md +150 -0
  146. package/patterns/redshift-queries/example/integrations.json +33 -0
  147. package/patterns/source-scanning/PATTERN.md +83 -0
  148. package/patterns/source-scanning/example/source-scanner.js +13 -0
  149. package/src/client/firebase-cloud-messaging.js +10 -0
  150. package/src/client/google-analytics.js +72 -0
  151. package/src/client/google-maps-platform.js +39 -0
  152. package/src/client/logo-dev.js +36 -0
  153. package/src/server/ai.js +46 -0
  154. package/src/server/airtable.js +67 -0
  155. package/src/server/algolia.js +63 -0
  156. package/src/server/amazon-redshift.js +96 -0
  157. package/src/server/amplitude.js +31 -0
  158. package/src/server/apify.js +68 -0
  159. package/src/server/apollo-io.js +85 -0
  160. package/src/server/asana.js +64 -0
  161. package/src/server/ashby.js +61 -0
  162. package/src/server/atlassian.js +32 -0
  163. package/src/server/attention.js +93 -0
  164. package/src/server/aws-athena.js +82 -0
  165. package/src/server/aws-s3.js +49 -0
  166. package/src/server/awsTransport.js +75 -0
  167. package/src/server/bigquery.js +97 -0
  168. package/src/server/brevo.js +97 -0
  169. package/src/server/calendly.js +77 -0
  170. package/src/server/canva.js +13 -0
  171. package/src/server/chargebee.js +88 -0
  172. package/src/server/clay.js +78 -0
  173. package/src/server/clickhouse.js +66 -0
  174. package/src/server/confidence.js +29 -0
  175. package/src/server/contentful.js +40 -0
  176. package/src/server/databricks.js +55 -0
  177. package/src/server/dbt-semantic-layer.js +95 -0
  178. package/src/server/elevenlabs.js +81 -0
  179. package/src/server/figma.js +24 -0
  180. package/src/server/firebase-cloud-messaging.js +111 -0
  181. package/src/server/firecrawl.js +70 -0
  182. package/src/server/fireflies.js +31 -0
  183. package/src/server/fireworks-ai.js +16 -0
  184. package/src/server/gatewayapi.js +48 -0
  185. package/src/server/gemini-enterprise.js +47 -0
  186. package/src/server/github-api.js +90 -0
  187. package/src/server/gitlab-api.js +67 -0
  188. package/src/server/gmail.js +60 -0
  189. package/src/server/gong.js +52 -0
  190. package/src/server/google-ads-search.js +134 -0
  191. package/src/server/google-ads.js +80 -0
  192. package/src/server/google-docs.js +36 -0
  193. package/src/server/google-drive.js +71 -0
  194. package/src/server/google-maps-platform.js +90 -0
  195. package/src/server/google-search-console.js +31 -0
  196. package/src/server/google-sheets.js +60 -0
  197. package/src/server/google-slides.js +36 -0
  198. package/src/server/google.js +61 -0
  199. package/src/server/granola.js +115 -0
  200. package/src/server/graphqlOperation.js +15 -0
  201. package/src/server/hex.js +29 -0
  202. package/src/server/heygen.js +54 -0
  203. package/src/server/hubspot.js +85 -0
  204. package/src/server/incident-io.js +68 -0
  205. package/src/server/inngest.js +86 -0
  206. package/src/server/jsonOperation.js +34 -0
  207. package/src/server/klipy.js +34 -0
  208. package/src/server/lexware.js +59 -0
  209. package/src/server/lightspeed.js +82 -0
  210. package/src/server/linear.js +52 -0
  211. package/src/server/linkedin.js +74 -0
  212. package/src/server/mailgun.js +76 -0
  213. package/src/server/mapbox.js +46 -0
  214. package/src/server/mcpRegistration.js +41 -0
  215. package/src/server/mcpTransport.js +60 -0
  216. package/src/server/microsoft-excel.js +67 -0
  217. package/src/server/microsoft-fabric.js +81 -0
  218. package/src/server/microsoft-onedrive.js +58 -0
  219. package/src/server/microsoft-onenote.js +52 -0
  220. package/src/server/microsoft-outlook.js +58 -0
  221. package/src/server/microsoft-powerpoint.js +5 -0
  222. package/src/server/microsoft-sharepoint.js +46 -0
  223. package/src/server/microsoft-teams.js +29 -0
  224. package/src/server/microsoft-word.js +5 -0
  225. package/src/server/microsoft.js +88 -0
  226. package/src/server/miro.js +29 -0
  227. package/src/server/n8n.js +78 -0
  228. package/src/server/notion.js +76 -0
  229. package/src/server/oura.js +48 -0
  230. package/src/server/paddle.js +83 -0
  231. package/src/server/perplexity.js +15 -0
  232. package/src/server/pipedrive.js +95 -0
  233. package/src/server/polar.js +20 -0
  234. package/src/server/posthog.js +44 -0
  235. package/src/server/prestashop.js +42 -0
  236. package/src/server/replicate.js +42 -0
  237. package/src/server/resend.js +93 -0
  238. package/src/server/salesforce.js +84 -0
  239. package/src/server/sanity.js +31 -0
  240. package/src/server/semrush.js +359 -0
  241. package/src/server/sentry.js +30 -0
  242. package/src/server/sevdesk.js +20 -0
  243. package/src/server/shopify.js +99 -0
  244. package/src/server/slack.js +143 -0
  245. package/src/server/snowflake.js +139 -0
  246. package/src/server/storyblok.js +49 -0
  247. package/src/server/stripe.js +13 -0
  248. package/src/server/supabase.js +13 -0
  249. package/src/server/tally.js +78 -0
  250. package/src/server/telegram.js +55 -0
  251. package/src/server/tiktok.js +86 -0
  252. package/src/server/twilio.js +90 -0
  253. package/src/server/twitch.js +409 -0
  254. package/src/server/wave.js +520 -0
  255. package/src/server/wix.js +1048 -0
  256. package/src/server/wiz.js +117 -0
  257. package/src/server/woocommerce.js +412 -0
  258. package/src/server/wordpress-com.js +236 -0
  259. package/src/server/wordpress-self-hosted.js +134 -0
  260. package/src/server/workday.js +136 -0
  261. package/src/server/x-twitter.js +110 -0
  262. package/src/server/xero.js +397 -0
  263. package/src/server/zoho-books.js +90 -0
  264. package/src/server/zoho-crm.js +89 -0
  265. package/src/server/zohoOAuth.js +21 -0
  266. package/src/shared/ai-models.json +8049 -0
  267. package/src/shared/ai.js +63 -0
  268. package/src/shared/algolia.js +29 -0
  269. package/src/shared/amazon-redshift.js +51 -0
  270. package/src/shared/amplitude.js +28 -0
  271. package/src/shared/atlassian.js +43 -0
  272. package/src/shared/aws.js +72 -0
  273. package/src/shared/canva.js +66 -0
  274. package/src/shared/chargebee.js +26 -0
  275. package/src/shared/clickhouse.js +38 -0
  276. package/src/shared/confidence.js +28 -0
  277. package/src/shared/databricks.js +33 -0
  278. package/src/shared/dbt-semantic-layer.js +32 -0
  279. package/src/shared/definitions.js +140 -0
  280. package/src/shared/figma.js +21 -0
  281. package/src/shared/firebase-cloud-messaging.js +45 -0
  282. package/src/shared/gemini-enterprise.js +33 -0
  283. package/src/shared/gong.js +33 -0
  284. package/src/shared/google-ads-search.js +31 -0
  285. package/src/shared/google-ads.js +28 -0
  286. package/src/shared/google-maps-platform.js +28 -0
  287. package/src/shared/google.js +133 -0
  288. package/src/shared/granola.js +25 -0
  289. package/src/shared/hex.js +28 -0
  290. package/src/shared/inngest.js +35 -0
  291. package/src/shared/lightspeed.js +75 -0
  292. package/src/shared/linkedin.js +27 -0
  293. package/src/shared/logo-dev.js +21 -0
  294. package/src/shared/mapbox.js +38 -0
  295. package/src/shared/mcp.js +92 -0
  296. package/src/shared/microsoft-fabric.js +47 -0
  297. package/src/shared/microsoft.js +231 -0
  298. package/src/shared/miro.js +27 -0
  299. package/src/shared/oura.js +23 -0
  300. package/src/shared/posthog.js +33 -0
  301. package/src/shared/prestashop.js +23 -0
  302. package/src/shared/salesforce.js +36 -0
  303. package/src/shared/semrush.js +24 -0
  304. package/src/shared/shopify.js +51 -0
  305. package/src/shared/siteUrl.js +12 -0
  306. package/src/shared/slack.js +88 -0
  307. package/src/shared/snowflake.js +55 -0
  308. package/src/shared/tiktok.js +22 -0
  309. package/src/shared/tokens.js +747 -0
  310. package/src/shared/twilio.js +41 -0
  311. package/src/shared/twitch.js +49 -0
  312. package/src/shared/wave.js +52 -0
  313. package/src/shared/wix.js +40 -0
  314. package/src/shared/wiz.js +41 -0
  315. package/src/shared/wordpress-com.js +30 -0
  316. package/src/shared/wordpress.js +69 -0
  317. package/src/shared/workday.js +50 -0
  318. package/src/shared/x-twitter.js +19 -0
  319. package/src/shared/xero.js +46 -0
  320. package/src/shared/zoho-books.js +39 -0
  321. package/src/shared/zoho-crm.js +43 -0
  322. package/src/shared/zoho-regions.js +12 -0
  323. package/test/ai.test.js +136 -0
  324. package/test/airtable.test.js +125 -0
  325. package/test/algolia.test.js +207 -0
  326. package/test/amazon-redshift.test.js +272 -0
  327. package/test/amplitude.test.js +239 -0
  328. package/test/apify.test.js +93 -0
  329. package/test/apollo-io.test.js +125 -0
  330. package/test/asana.test.js +99 -0
  331. package/test/ashby.test.js +97 -0
  332. package/test/atlassian.test.js +249 -0
  333. package/test/attention.test.js +79 -0
  334. package/test/aws.test.js +405 -0
  335. package/test/brevo.test.js +71 -0
  336. package/test/calendly.test.js +136 -0
  337. package/test/canva.test.js +258 -0
  338. package/test/chargebee.test.js +195 -0
  339. package/test/clickhouse.test.js +278 -0
  340. package/test/confidence.test.js +205 -0
  341. package/test/databricks.test.js +253 -0
  342. package/test/dbt-semantic-layer.test.js +221 -0
  343. package/test/designMcp.test.js +336 -0
  344. package/test/elevenlabs.test.js +52 -0
  345. package/test/firebase-cloud-messaging.test.js +242 -0
  346. package/test/firecrawl.test.js +66 -0
  347. package/test/gemini-enterprise.test.js +218 -0
  348. package/test/github-api.test.js +167 -0
  349. package/test/gitlab-api.test.js +160 -0
  350. package/test/gong.test.js +192 -0
  351. package/test/google-ads.test.js +350 -0
  352. package/test/google-maps-platform.test.js +191 -0
  353. package/test/google.test.js +710 -0
  354. package/test/granola.test.js +240 -0
  355. package/test/hex.test.js +253 -0
  356. package/test/heygen.test.js +121 -0
  357. package/test/hubspot.test.js +103 -0
  358. package/test/inngest.test.js +219 -0
  359. package/test/lightspeed.test.js +250 -0
  360. package/test/linear.test.js +146 -0
  361. package/test/linkedin.test.js +243 -0
  362. package/test/logo-dev.test.js +79 -0
  363. package/test/mailgun.test.js +107 -0
  364. package/test/mapbox.test.js +181 -0
  365. package/test/mcp.test.js +227 -0
  366. package/test/microsoft-fabric.test.js +258 -0
  367. package/test/microsoft.test.js +554 -0
  368. package/test/n8nOAuth.test.js +188 -0
  369. package/test/notionOAuth.test.js +183 -0
  370. package/test/oura.test.js +211 -0
  371. package/test/paddleCatalogue.test.js +51 -0
  372. package/test/paddlePermissions.test.js +101 -0
  373. package/test/perplexityComposition.test.js +39 -0
  374. package/test/pipedriveOAuth.test.js +140 -0
  375. package/test/posthog.test.js +200 -0
  376. package/test/prestashop.test.js +207 -0
  377. package/test/resend.test.js +163 -0
  378. package/test/salesforce.test.js +276 -0
  379. package/test/semrush.test.js +479 -0
  380. package/test/sentry.test.js +35 -0
  381. package/test/shopify.test.js +247 -0
  382. package/test/slack.test.js +320 -0
  383. package/test/snowflake.test.js +391 -0
  384. package/test/tally.test.js +75 -0
  385. package/test/telegram.test.js +58 -0
  386. package/test/tiktok.test.js +243 -0
  387. package/test/tokens.test.js +1079 -0
  388. package/test/twilio.test.js +221 -0
  389. package/test/twitch.test.js +573 -0
  390. package/test/wave.test.js +678 -0
  391. package/test/wix.test.js +1099 -0
  392. package/test/wiz.test.js +185 -0
  393. package/test/wordpress-com.test.js +469 -0
  394. package/test/wordpress.test.js +660 -0
  395. package/test/workday.test.js +314 -0
  396. package/test/x-twitter.test.js +256 -0
  397. package/test/xero.test.js +700 -0
  398. package/test/zoho-books.test.js +253 -0
  399. package/test/zoho-crm.test.js +223 -0
package/docs/wix.md ADDED
@@ -0,0 +1,1249 @@
1
+ # Wix
2
+
3
+ Import `wixProvider` from `@jskit-ai/connectors-catalog/server/wix`. The
4
+ runtime reads account sites and business locations, manages site contacts and
5
+ booking-service settings, queries availability, creates/cancels bookings, reads orders
6
+ and reads/edits products in both Wix catalogue versions. Vibe64 and CLI consumers
7
+ edit the same JSON and use shared validation, authorization and encrypted file
8
+ storage. Provider acceptance is still in progress; see Verification status below.
9
+
10
+ ## Provider setup
11
+
12
+ 1. Sign into the intended Wix account as an owner or co-owner. Open account
13
+ settings and its API Keys Manager. Copy the Account ID shown there.
14
+ 2. Generate a key, name it for this integration and select **Read Site Data**
15
+ for querying sites. Grant only the access the application needs. Complete
16
+ the requested verification and store the issued token securely on the backend.
17
+ 3. In an Enterprise dashboard, the documented path is API Keys, **Generate API
18
+ Key**, key details/permissions, **Generate Key**, account verification, then
19
+ **Copy Token & Close**. Other account dashboards may present different labels.
20
+ 4. Put the token in `WIX_API_KEY`; put its reference and the Account ID in the
21
+ JSON below. The account ID is not a site ID. Save the file, then explicitly
22
+ call `connectApiKey` when ready. It checks account site discovery; it does not
23
+ prove permission for every site operation. Verify the intended read operation
24
+ before enabling its feature, and grant write permissions only when needed.
25
+
26
+ [Key generation](https://dev.wix.com/docs/go-headless/authentication/admin/generate-an-api-key),
27
+ [Enterprise console steps](https://support.wix.com/en/article/wix-enterprise-using-wix-api-keys),
28
+ [account and site identifiers](https://dev.wix.com/docs/develop-websites-sdk/code-your-site/authorization/make-rest-api-calls-with-an-api-key).
29
+
30
+ ```json
31
+ {
32
+ "schemaVersion": 1,
33
+ "registrations": {},
34
+ "integrations": {
35
+ "website-account": {
36
+ "provider": "wix",
37
+ "displayName": "Wix sites",
38
+ "accountMode": "shared",
39
+ "scopes": [],
40
+ "authentication": { "method": "api-key", "secretRef": "env:WIX_API_KEY" },
41
+ "settings": {
42
+ "accountId": "01234567-89ab-cdef-0123-456789abcdef",
43
+ "siteId": "12345678-9abc-def0-1234-56789abcdef0"
44
+ }
45
+ }
46
+ }
47
+ }
48
+ ```
49
+
50
+ Replace both illustrative IDs with your own account and intended site. Site ID
51
+ is required for every operation except `sites.list`; omit it only while discovering
52
+ the site. Copy it from the Wix dashboard URL after `/dashboard/`, or from an
53
+ authorized `sites.list` result. Save and verify again after changing either binding. Assistant ownership is available with the host's access policy. Per-user
54
+ OAuth and Wix member/application login are separate flows, outside this fragment.
55
+ An account key grants administrative access without a user session; it must stay
56
+ on the server. [Authentication boundary](https://dev.wix.com/docs/overview/auth-permissions/authentication-methods).
57
+
58
+ ## CLI and runtime
59
+
60
+ Compose `createConnectionService` with `wixProvider`, the parsed file, encrypted
61
+ file storage and the host's trusted owner/operation policy, following the
62
+ packaged API-key connection pattern. Pass this provider to configuration
63
+ validation as well. No application template or editor database is needed.
64
+
65
+ ```js
66
+ await connections.connectApiKey({
67
+ context: authenticatedOwner, integrationId: "website-account"
68
+ });
69
+ const page = await connections.invoke({
70
+ context: authenticatedOwner, integrationId: "website-account",
71
+ operation: "sites.list", input: { limit: 20 }
72
+ });
73
+ const next = page.metadata?.cursors?.next;
74
+ // Pass next as input.cursor only for an explicit subsequent page request.
75
+ ```
76
+
77
+ `sites.list` POSTs to `https://www.wixapis.com/site-list/v2/sites/query` with a
78
+ `query.cursorPaging` object. `limit` is 1–100 (library default 20); `cursor` is
79
+ an opaque returned string. There is no arbitrary filter, URL, account override
80
+ or site-write operation on `sites.list`. Empty site lists are successful. Results use REST `id`, not
81
+ the SDK's `_id`, and preserve original site fields plus optional metadata.
82
+ Wix documents a maximum of 1,000 retrievable sites for this endpoint; this
83
+ fragment does not promise a complete unlimited account export.
84
+ [Query Sites](https://dev.wix.com/docs/api-reference/account-level/sites/sites/query-sites),
85
+ [endpoint limitations](https://dev.wix.com/docs/api-reference/account-level/sites/sites/introduction).
86
+
87
+ `sites.list` sends the key itself in `Authorization` and the configured account
88
+ in `wix-account-id`. Site operations instead send only `wix-site-id`. No Bearer
89
+ prefix is added to the key.
90
+ Keep cursors with the same account and query. Consumers must authorize returned
91
+ site data and treat returned URLs as data, not privileged runtime destinations.
92
+ [REST headers](https://dev.wix.com/docs/develop-websites-sdk/code-your-site/authorization/make-rest-api-calls-with-an-api-key).
93
+
94
+ The runtime verifies before saving and resolves the key reference again for
95
+ later operations, allowing operator rotation. Status reports reconnect-required
96
+ after a key change until verification or a successful operation verifies it.
97
+ Changing the account or site setting requires
98
+ verification again. Local disconnect deletes local access without revoking the
99
+ provider key. API failures are sanitized; 401 requires reconnect, 403 indicates
100
+ missing access, and 429 reports a rate limit without retrying. Malformed result
101
+ fields and input values fail explicitly. Cancellation preserves a verified grant.
102
+
103
+ ## Public, Online and automation
104
+
105
+ For this account-key flow, the universal OAuth callback is **not applicable**.
106
+ Customer VPS and custom-domain URLs do not enter the provider authentication
107
+ request. Each connected customer account requires its own authorized account
108
+ binding. A single Vibe64-owned account key cannot grant access to unrelated
109
+ customers' Wix accounts.
110
+
111
+ The application owner supplies the authorized key and its matching Wix account
112
+ binding through private Env and configuration. The backend enforces access to
113
+ that account and keeps the key off browsers. Separate keys do not establish
114
+ independent quota pools; provider limits and permitted use still apply. CLI and
115
+ Vibe64 users configure the same application-owned key flow.
116
+
117
+ | Task | Automation assessment |
118
+ |---|---|
119
+ | Create an application-owned provider registration | This captured mode uses account keys, with no OAuth app registration. Other Wix app flows require a separate implementation. |
120
+ | Issue account keys | Reviewed documentation establishes the console and account verification process. No unattended key-issuance API was established for this workflow. |
121
+ | Prepare configuration and runtime wiring | AI can write/validate the portable file, compose existing library APIs and supply the operation policy. |
122
+ | Read accessible sites | The library performs explicit pages after verification. It does not create, publish or modify sites. |
123
+
124
+ ## Capability and permission map
125
+
126
+ Permissions below are granted to the key in Wix. The JSON `scopes` remains empty;
127
+ selecting a capability in an application cannot grant a missing provider permission.
128
+
129
+ | Workflow | Operations | Required access |
130
+ |---|---|---|
131
+ | Find account sites | `sites.list` | Read Site Data |
132
+ | Select business locations | `locations.list/get` | Read Locations |
133
+ | Read contacts | `contacts.list/get` | Read Contacts |
134
+ | Create/edit contacts | `contacts.create/update` | Manage Contacts |
135
+ | Read booking offerings | `bookingServices.list/get` | Read Bookings - Public Data |
136
+ | Create/edit services; create/cancel bookings | `bookingServices.create/update`, `bookings.create/cancel` | Manage Bookings |
137
+ | Inspect bookings | `bookings.list` | Read Bookings or applicable Manage Bookings access |
138
+ | Check appointment/class availability | `availability.list/get`, `classAvailability.list/get` | Time Slots read permission |
139
+ | Discover booking form fields | `forms.summary` | Get Form Summary |
140
+ | Read orders | `orders.list/get` | Read Orders |
141
+ | Discover catalogue version | `catalog.version` | Read v3 catalog (PII) |
142
+ | Read V1/V3 products | `productsV1.list/get`, `productsV3.list/get` | Read Products / Read products in v3 catalog |
143
+ | Edit V1/V3 products | `productsV1.update`, `productsV3.update` | Manage Products / Product write in v3 catalog |
144
+
145
+ The runtime's trusted host policy must authorize the actual operation and its
146
+ business object. A shared site key is not proof that an app user owns a booking,
147
+ contact or order. Authorize that relationship before returning data or writing.
148
+ The generated app owns its customer screens, checkout and domain-specific rules.
149
+ Public Vibe64 owns editing this project configuration; Online adds no Wix gateway.
150
+
151
+ ## Verification status
152
+
153
+ The controlled provider suite currently passes **40/40**, including identity
154
+ headers, input validation, pagination, exact revisions, write bodies, ownership,
155
+ key rotation and failure handling. These use fixtures, not a live Wix account.
156
+ The expanded and compact editor cases each pass with the current Site ID,
157
+ Selectable Site IDs and setup guidance: invalid input, text configuration save and
158
+ reload, missing credentials, connect, reconnect and local disconnect. These browser
159
+ cases use controlled connection responses. A freshly packed catalog installed
160
+ offline in a standalone consumer passed the same 29 controlled cases through
161
+ public package exports, including this guide’s configuration. This proves the
162
+ implemented operations and configuration/lifecycle UI, not the missing workflows
163
+ below or live provider behavior.
164
+ No generated application, payment, real booking or release has been exercised.
165
+
166
+ The following remain outside the implemented operations and need explicit scope
167
+ reconciliation before acceptance: scheduled session management,
168
+ variable-duration and service-variant/add-on booking choices, product creation,
169
+ variant/inventory edits, checkout/fulfilment/refunds.
170
+ Do not infer support for them from a successful connection check.
171
+
172
+ ## Site CRM queries
173
+
174
+ Set `settings.siteId` to the intended site's ID, copied from the Wix dashboard URL
175
+ after `/dashboard/`, or selected from `sites.list`. Grant the key **Read Contacts**
176
+ and restrict its site access to the intended sites. Save configuration and verify
177
+ again after changing this binding. By default the caller cannot override this site. Explicit selection is allowed
178
+ only through the configured Selectable Site IDs described below. The app's authorization policy controls which user may read its contacts.
179
+
180
+ `contacts.list` accepts `limit` (1–100, default 20), `offset` (0–100000, default 0)
181
+ and optional `search` (1–100 characters). It calls the documented Contacts v4 query
182
+ with `query.paging` and top-level search. The backend sends the API key and only
183
+ `wix-site-id`; `sites.list` continues to send only `wix-account-id`. These two
184
+ identity headers must not be combined. Contact fields and paging metadata remain
185
+ provider data; no personal details are exposed to unauthenticated callers by the
186
+ library. Native frameworks use the same endpoint and header selection.
187
+
188
+ [Contacts query](https://dev.wix.com/docs/api-reference/crm/members-contacts/contacts/contacts/contact-v4/query-contacts).
189
+
190
+ Rotating the Env key changes status to reconnect-required until a successful
191
+ verification or authorized operation verifies the new key. No OAuth callback or
192
+ application login is introduced by this administrative credential.
193
+
194
+ ## Contact creation and updates
195
+
196
+ Grant **Manage Contacts** for `contacts.create` and `contacts.update`, and
197
+ **Read Contacts** for `contacts.get` and `contacts.list`. These are permissions
198
+ on the provider key, rather than OAuth scopes chosen in the application file.
199
+ The same configured Site ID and private Env key are used by CLI and editor hosts.
200
+
201
+ - `contacts.create`: `{ info, allowDuplicates?: false }`. Supply a name, an email
202
+ or a phone; company alone is insufficient. Supported info fields are
203
+ `name: { first, last }`, `company`, `jobTitle`,
204
+ `emails: { items: [{ email, primary?, tag? }] }`, and
205
+ `phones: { items: [{ phone, countryCode?, primary? }] }`. Email and phone lists
206
+ are bounded to 50 entries. Duplicate creation remains disabled by default.
207
+ - `contacts.get`: `{ contactId }`. Use its returned `contact.revision` when editing.
208
+ - `contacts.update`: `{ contactId, revision, info, allowDuplicates?: false }`.
209
+ Submit the intended changed fields. Revision is required and Wix rejects stale
210
+ changes; reload and reconcile with the user rather than automatically replaying.
211
+
212
+ Native frameworks POST to `/contacts/v4/contacts`, GET a contact by ID, or PATCH
213
+ `/contacts/v4/contacts/{contactId}` with revision and info. Returned contact IDs
214
+ are checked against the requested target. The app owns authorization, validation
215
+ of business intent and handling of uncertain writes. A successful transport is
216
+ not proof of a live provider connection in this milestone.
217
+
218
+ Member login emails use Wix's separate Members API; do not use contact updates
219
+ to change them. Contact merging, deletion, addresses, labels and custom fields
220
+ are outside these operations.
221
+
222
+ [Create Contact](https://dev.wix.com/docs/api-reference/crm/members-contacts/contacts/contacts/contact-v4/create-contact),
223
+ [Update Contact](https://dev.wix.com/docs/api-reference/crm/members-contacts/contacts/contacts/contact-v4/update-contact).
224
+
225
+ ## Booking service catalog
226
+
227
+ Enable Wix Bookings on the intended site. Grant **Read Bookings - Public Data**
228
+ for `bookingServices.list/get`, and **Manage Bookings** for updates. The configured
229
+ Site ID controls every request; account discovery remains separately account-bound.
230
+
231
+ `bookingServices.list` accepts `limit` (1–100, default 20) and `offset`
232
+ (0–100000, default 0), returning services and provider paging metadata.
233
+ `bookingServices.get` accepts `{ serviceId }`. `bookingServices.update` accepts
234
+ `{ serviceId, revision, name?, description?, tagLine? }`, with at least one changed
235
+ field. Copy the returned revision **as a string**, including values beyond
236
+ JavaScript's safe integer range. Wix checks that it is current; the adapter does
237
+ not automatically replay conflicts or network failures.
238
+
239
+ Native frameworks use POST `/_api/bookings/v2/services/query` with `query.paging`,
240
+ GET `/_api/bookings/v2/services/{id}`, and PATCH that path with
241
+ `{ service: { id, revision, ...changedFields } }`. Returned service IDs are checked
242
+ against the requested target. Service IDs refer to offerings, not appointments.
243
+ The app owns editing screens, authorization and reconciliation. Service creation
244
+ and updates to pricing, staff and appointment constraints are documented below.
245
+ Scheduled sessions, service locations and add-ons use separate native operations.
246
+
247
+ [Query Services](https://dev.wix.com/docs/api-reference/business-solutions/bookings/services/services-v2/query-services),
248
+ [Update Service](https://dev.wix.com/docs/api-reference/business-solutions/bookings/services/services-v2/update-service).
249
+
250
+
251
+ ### Cancel an existing booking
252
+
253
+ `bookings.cancel` accepts `bookingId`, the current `revision` as an exact decimal
254
+ string, optional `notifyParticipants` and `message`, and optional `waiveCharges`.
255
+ Both booleans default to false. A message requires notification to be enabled.
256
+ The project backend must authorize access to that booking before invoking it.
257
+ The configured Site ID determines the Wix site unless the caller selects a
258
+ project-approved site through Selectable Site IDs.
259
+
260
+ This uses [Cancel Booking](https://dev.wix.com/docs/api-reference/business-solutions/bookings/bookings/bookings-writer-v2/cancel-booking)
261
+ and requires Manage Bookings. It preserves normal provider cancellation policies,
262
+ rejects an unexpected booking/status response, and never retries a conflict or
263
+ ambiguous write automatically. Read the current booking state before deciding
264
+ whether another attempt is appropriate. `waiveCharges` can also cancel an eligible
265
+ outstanding Wix eCommerce order under Wix's documented conditions; it does not
266
+ issue a refund. Applications own their cancellation confirmation and notification UI.
267
+ The same operation/configuration is available to CLI-created JSKIT apps; other
268
+ frameworks can use that documented endpoint with their own HTTP/runtime code.
269
+
270
+ Booking creation and appointment availability are described below.
271
+ Do not substitute [Confirm Booking](https://dev.wix.com/docs/api-reference/business-solutions/bookings/bookings/bookings-writer-v2/confirm-booking)
272
+ for a normal availability check: that method explicitly confirms without checking
273
+ availability and is restricted to custom checkout flows. Wix eCommerce checkout
274
+ owns confirmation in its own flow.
275
+
276
+
277
+ ### Read bookings before acting
278
+
279
+ `bookings.list` uses [Query Extended Bookings](https://dev.wix.com/docs/api-reference/business-solutions/bookings/bookings/bookings-reader-v2/query-extended-bookings).
280
+ Pass optional `bookingId` for an exact ID lookup, or `limit` (1–100) and `offset`
281
+ for a page. It returns native `extendedBookings` and `pagingMetadata`, including
282
+ current booking revision/status and requested `allowedActions`. Empty results are
283
+ valid, including an ID that no longer exists. A filtered response containing a
284
+ different booking is rejected. Do not assume an allowed action is still available
285
+ later; cancellation can fail if policy or revision changed in the meantime.
286
+
287
+ Grant the corresponding Read Bookings permission (or Manage Bookings for the
288
+ administrative write workflow). This is a backend site-wide credential, not each
289
+ customer's authorization. The generated app must check booking ownership before
290
+ returning private details or invoking actions. Frameworks other than JSKIT use the
291
+ same configured site and Env credential with their native HTTP client. No editor
292
+ or Vibe64 server is required by the deployed app.
293
+
294
+
295
+ ### Appointment availability
296
+
297
+ `availability.list` accepts an appointment `serviceId`, explicit IANA `timeZone`,
298
+ `fromLocalDate` and `toLocalDate` in `YYYY-MM-DDThh:mm:ss` without an offset, and
299
+ optional `limit` (1–1000, default 100). It requests bookable slots using
300
+ [List Availability Time Slots](https://dev.wix.com/docs/api-reference/business-solutions/bookings/time-slots/time-slots-v2/list-availability-time-slots).
301
+ For the next page pass only the returned `cursor` and the same `limit`. Responses
302
+ retain native resources/location details and `cursorPagingMetadata`.
303
+
304
+ After selection, call `availability.get` with `serviceId`, `timeZone`, and the
305
+ returned `localStartDate`/`localEndDate`. This uses
306
+ [Get Availability Time Slot](https://dev.wix.com/docs/api-reference/business-solutions/bookings/time-slots/time-slots-v2/get-availability-time-slot).
307
+ Check `timeSlot.bookable` again; false is a valid changed-availability result.
308
+ The operation does not reserve capacity. Creation can still fail due to a race.
309
+ These calls require the Time Slots read permission
310
+ (`BOOKINGS.AVAILABILITY_READ_TIME_SLOTS`) on the project's Wix key.
311
+
312
+ The generated app owns the date picker, customer authorization and stale-slot
313
+ message. CLI-created JSKIT apps invoke the same operations; other frameworks use
314
+ these native endpoints with the same site/Env configuration. Current operations
315
+ cover appointment defaults. Class/event slots are described below. Duration-range choices still need implementation; resource/location filters are
316
+ described below.
317
+
318
+
319
+
320
+ ### Create a booking
321
+
322
+ `bookings.create` uses [Create Booking](https://dev.wix.com/docs/api-reference/business-solutions/bookings/bookings/bookings-writer-v2/create-booking)
323
+ with Manage Bookings permission. Required common input: `serviceId`, `kind`,
324
+ `timeZone`, and `formSubmission` (JSON object, at most 100 KB). For fixed-price
325
+ services, `totalParticipants` defaults to 1. Optional `notifyParticipants` and
326
+ `sendSmsReminder` both default to false in this adapter; opt in deliberately.
327
+
328
+ - `APPOINTMENT`: supply increasing local `startDate`/`endDate`, selected
329
+ `resourceId`, and `location` (`locationType`, business `id` where applicable,
330
+ optional name/formattedAddress). Recheck availability first.
331
+ - `CLASS`: supply the selected `eventId`; Wix derives slot details. Do not mix
332
+ appointment fields into this input.
333
+ - `COURSE`: supply the selected `scheduleId`; verify remaining capacity first.
334
+
335
+ Fetch the service's `form.id` and use
336
+ [Get Form Summary](https://dev.wix.com/docs/rest/crm/forms/form-schemas/get-form-summary)
337
+ to build the form. Use each returned field's exact `target` as its
338
+ `formSubmission` key, not its display label. Wix stores standard contact fields
339
+ on the booking contact and other fields in its form submission. The app owns the
340
+ form rendering, validation, customer authorization and any checkout. Use `forms.summary` with `formId` for that discovery; the native GET endpoint is
341
+ `https://www.wixapis.com/form-schema-service/v4/forms/{formId}/summary`.
342
+
343
+ The response is the native booking, including its real status. Creation does not
344
+ mean payment or confirmation. No payment status or policy override can be supplied
345
+ through this operation. An unavailable/full slot or missing required form value
346
+ can fail at Wix; surface a useful application error and do not retry the create
347
+ blindly. JSKIT CLI apps use this same operation with project config/Env; other
348
+ frameworks use the documented POST body with their own HTTP library. Custom/duration variants and add-ons are supported as described below;
349
+ custom-checkout confirmation is explicit as described below; Wix-hosted checkout uses Cart V2 below.
350
+
351
+
352
+ ### Booking form discovery
353
+
354
+ `forms.summary` reads the selected service's `form.id`. It returns the native
355
+ `formSummary`: field `target`, `label`, `type`, `options`, `deleted` and nested
356
+ field data where provided. Skip deleted fields, escape labels when rendering, and
357
+ map submitted values to exact targets. The summary intentionally omits complex
358
+ validation/layout details; it is not a complete form-validation engine. Applications
359
+ must still handle Wix validation failures, and complex custom forms may need the
360
+ full native Forms API. Grant Get Form Summary (`forms:v4:form:get_form_summary`)
361
+ as required for the intended site's forms. API-key authorization stays server-side.
362
+
363
+ The operation uses a fixed site and validates the returned form identity and
364
+ basic field structure. No field data becomes executable markup. CLI callers use
365
+ `connections.invoke({ context, integrationId, operation: "forms.summary", input:
366
+ { formId } })`; other frameworks call the same GET with their own HTTP client.
367
+
368
+
369
+
370
+ ### Class availability
371
+
372
+ `classAvailability.list` takes the same service/local-date/time-zone range as
373
+ appointment availability, plus optional `minBookableCapacity` for party size.
374
+ It uses [List Event Time Slots](https://dev.wix.com/docs/api-reference/business-solutions/bookings/time-slots/time-slots-v2/list-event-time-slots),
375
+ filters to the selected service, and excludes non-bookable slots. Continue with
376
+ only `cursor`/`limit`; class responses use `pagingMetadata`, while appointment
377
+ responses use `cursorPagingMetadata`.
378
+
379
+ Call `classAvailability.get` with the selected `timeSlot.eventInfo.eventId` as `eventId` and `timeZone` to use
380
+ [Get Event Time Slot](https://dev.wix.com/docs/api-reference/business-solutions/bookings/time-slots/time-slots-v2/get-event-time-slot).
381
+ Check current bookability/capacity before submitting `bookings.create` with
382
+ `kind: "CLASS"`. The generated app owns party-size selection and lost-capacity
383
+ feedback. This does not reserve seats. A mismatched event/service/time-zone
384
+ response is rejected. CLI/native framework users follow the same native flow and
385
+ project-owned credentials; no Vibe64 service participates in the booking.
386
+
387
+
388
+ ### Select a resource and location
389
+
390
+ Appointment `availability.list` accepts up to five `locations` and up to 100
391
+ `includeResourceTypeIds`. These type IDs request resource detail in the response;
392
+ they do not themselves select a particular staff member. Wix normally leaves
393
+ `availableResources` empty on list responses unless resource details are requested.
394
+ `availability.get` returns candidate resources by default and accepts `location`
395
+ and up to eight `resourceTypes` entries, each with `resourceTypeId` and 1–135
396
+ `resourceIds`, to recheck a chosen resource. Use resource IDs, not staff contact IDs.
397
+
398
+ Availability location types differ from Bookings Writer types. Follow Wix's
399
+ [location mapping](https://dev.wix.com/docs/api-reference/business-solutions/bookings/time-slots/time-slots-v2/get-availability-time-slot):
400
+ `BUSINESS` becomes `OWNER_BUSINESS`, and `CUSTOM` becomes `OWNER_CUSTOM` when
401
+ passing a selected location to `bookings.create`. Business locations require their
402
+ ID. For a customer-chosen address, collect the address and use the writer's
403
+ `CUSTOM` location explicitly. Do not copy availability's `CUSTOMER` enum into the
404
+ writer request. CLI/native framework code must perform the same mapping.
405
+
406
+ The native class slot nests its event ID at `eventInfo.eventId`; there is no
407
+ top-level slot `eventId`.
408
+
409
+ ### eCommerce order reads
410
+
411
+ Grant **Read Orders** on the intended site's API key. `orders.list` uses
412
+ [Search Orders](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/orders/orders/search-orders)
413
+ with optional `status`, buyer `contactId`, and `limit` (1–100, default 20).
414
+ Continue with only the returned `cursor` and `limit`. The result preserves native
415
+ orders and `metadata`, including decimal money strings and payment status.
416
+ A contact filter is a query convenience; the app must separately enforce who can
417
+ read each order. Never expose site-wide order data to an unauthenticated caller.
418
+
419
+ Wix excludes PENDING and REJECTED orders by default; request those statuses
420
+ explicitly when needed. Search never returns INITIALIZED orders. Use `orders.get`
421
+ with a known `orderId` for the individual
422
+ [Get Order](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/orders/orders/get-order)
423
+ endpoint. Missing orders produce the provider error; a response for a different
424
+ order is rejected. Neither operation collects payment or changes an order.
425
+ Detailed transaction/refund history requires the native transactions API.
426
+
427
+ CLI-created JSKIT apps invoke these operations through the same connection
428
+ service; other frameworks use the same site-scoped endpoints and Env key with
429
+ their own HTTP client. The generated app owns commerce screens, authorization,
430
+ fulfilment and payment reconciliation. No Vibe64 gateway or managed key is used.
431
+
432
+
433
+
434
+ ### Determine the store catalogue version
435
+
436
+ Call `catalog.version` with no input, after setting the project's Site ID. It uses
437
+ [Get Catalog Version](https://dev.wix.com/docs/api-reference/business-solutions/stores/catalog-versioning/get-catalog-version)
438
+ and returns `V1_CATALOG`, `V3_CATALOG` or `STORES_NOT_INSTALLED`. The latter is a
439
+ valid prerequisite result: install Wix Stores in the intended site before trying
440
+ to use product operations. Grant the documented **Read v3 catalog (PII)** permission
441
+ for version discovery, along with the permissions needed for actual product access.
442
+
443
+ Wix's [catalogue-version guidance](https://dev.wix.com/docs/api-reference/business-solutions/stores/catalog-versioning/introduction?apiView=SDK)
444
+ requires using the site's actual version. V1 and V3 are incompatible, including
445
+ product/variant data and paging. Product support must cover both; do not assume
446
+ new-site V3 behavior applies to existing stores. The same check is available to
447
+ CLI apps and native frameworks, using only the site-owned key and configuration.
448
+ No automatic store installation, catalogue migration or account provisioning occurs.
449
+
450
+
451
+ ### Read products from either catalogue
452
+
453
+ Start with `catalog.version`, then select `productsV1.list`/`productsV1.get` or
454
+ `productsV3.list`/`productsV3.get`. A site without Wix Stores needs installation
455
+ before these operations. Both get operations accept `productId`; list limits are
456
+ 1–100, default 20. All operations use the project's configured Site ID.
457
+
458
+ - V1 uses `offset` (default 0) and optional `includeVariants` (default false).
459
+ It preserves `metadata` and `totalResults` from
460
+ [Query Products V1](https://dev.wix.com/docs/api-reference/business-solutions/stores/catalog-v1/catalog/query-products).
461
+ - V3 uses the returned `cursor` and preserves `pagingMetadata` from
462
+ [Query Products V3](https://dev.wix.com/docs/api-reference/business-solutions/stores/catalog-v3/products-v3/query-products).
463
+ V3 product queries omit variants. Use the individual
464
+ [Get Product V3](https://dev.wix.com/docs/api-reference/business-solutions/stores/catalog-v3/products-v3/get-product)
465
+ operation for product/variant details.
466
+
467
+ Grant Read Products for V1 or Read products in v3 catalog for V3. Hidden products
468
+ require additional provider administrative permissions; these list operations do
469
+ not request hidden products or merchant-specific financial data. A provider denial
470
+ is surfaced without retrying another catalogue version. Recheck the actual version
471
+ if a site was migrated; never reuse an old cursor across versions.
472
+
473
+ The library preserves native prices, variants and product data, including the
474
+ structural differences between V1 and V3. Applications own the product UI and
475
+ version-specific interpretation. CLI-created JSKIT apps use these same names and
476
+ configuration; other frameworks dispatch to the documented native endpoints after
477
+ version discovery. No compatibility shim converts money or variants between APIs.
478
+
479
+
480
+
481
+ ### V3 product name and visibility edits
482
+
483
+ After `catalog.version` returns `V3_CATALOG`, use `productsV3.get` to read the
484
+ current revision, then `productsV3.update` with `productId`, the exact string
485
+ `revision`, and `name` (1–80 characters), `visible`, or both. Requires **Product
486
+ write in v3 catalog** on the configured site. The runtime sends only those
487
+ changed scalar fields; omitted fields remain unchanged. Wix also changes the
488
+ default variant's visibility for a product without options. For products with
489
+ options, variant visibility is independent.
490
+
491
+ A conflict requires a fresh read and a deliberate decision about the proposed
492
+ change. Failed writes are not automatically replayed. This operation does not
493
+ edit variant arrays, prices or inventory; their separate contracts remain work
494
+ in progress. Applications and CLI consumers use the same project-owned runtime
495
+ and Env key, with their own administrator authorization.
496
+
497
+ Contract: [Wix Update Product](https://dev.wix.com/docs/api-reference/business-solutions/stores/catalog-v3/products-v3/update-product).
498
+
499
+
500
+ ### V1 product edits
501
+
502
+ For `V1_CATALOG`, `productsV1.update` accepts `productId` and at least one of
503
+ `name` (1–80 characters), `visible`, or numeric `price` (0–999999999.99).
504
+ Grant **Manage Products** to the site API key. Prices are base prices in the
505
+ site's currency, not minor units or converted visitor prices. Zero is valid.
506
+ The adapter uses `PATCH /stores/v1/products/{id}`; reads use the separate
507
+ `stores-reader` endpoint. Omitted fields are preserved. V1 does not offer the
508
+ V3 revision guard: the app must manage concurrent administrator edits and
509
+ reconcile uncertain writes before trying again. This operation does not edit
510
+ variant prices, discounts or inventory.
511
+
512
+ Contract: [Wix V1 Update Product](https://dev.wix.com/docs/rest/business-solutions/stores/catalog/update-product).
513
+
514
+
515
+ ### Business locations for booking selection
516
+
517
+ Grant **Read Locations** for `locations.list` and `locations.get`. Both use the
518
+ configured project Site ID. List accepts `limit` (1–100), `offset` and `archived`
519
+ (default false), and requests only authorized locations. The response preserves
520
+ Wix addresses, business schedules and time zones; the app chooses which details
521
+ to expose. Get accepts `locationId` and checks the returned identity. Use these
522
+ IDs for business-location availability filters and booking creation, with each
523
+ API's documented location-type mapping. Location discovery does not reserve a
524
+ slot or change business hours. CLI consumers invoke the same operations.
525
+
526
+ [Wix Query Locations](https://dev.wix.com/docs/api-reference/business-management/locations/query-locations).
527
+
528
+
529
+ ### CMS collection browser
530
+
531
+ `cmsCollections.list` reads collections for the configured site. Grant **Manage
532
+ Data Collections**, even though these operations only read. Pass `limit` (1–100),
533
+ `offset` and optional `consistentRead` (default false). Responses preserve
534
+ `collections` and `pagingMetadata`, including field metadata. Use
535
+ `cmsCollections.get` with the returned `collectionId` to inspect a collection.
536
+ App collection IDs such as `AppName/CollectionName` retain their namespace.
537
+ Both operations are site-bound; another Site ID is accepted only when explicitly
538
+ approved through Selectable Site IDs.
539
+
540
+ Consistent reads request primary-database data at a performance cost. The app owns
541
+ collection selection, escaping metadata labels and authorization. This is schema
542
+ browsing, not content-item querying, collection replacement or field deletion.
543
+ CLI apps use these operations and the same Env key; native frameworks use the
544
+ GET collection endpoints with their own client.
545
+
546
+ [Wix List Data Collections](https://dev.wix.com/docs/api-reference/business-solutions/cms/collection-management/data-collections/list-data-collections).
547
+
548
+
549
+ `cmsItems.list` completes content browsing after collection selection. Grant
550
+ **Read Data Items**, then pass `collectionId`, `limit` (1–100), `offset` and
551
+ optional `consistentRead`. It calls `POST /wix-data/v2/items/query` and preserves
552
+ native `dataItems` and `pagingMetadata`, including Wix date objects. Cross-collection
553
+ results are rejected. The app must authorize collection and record access before
554
+ exposing content, and safely render field values. Field editing is available through cmsItems.patch below; draft/publication workflows remain unimplemented.
555
+
556
+ [Wix Query Data Items](https://dev.wix.com/docs/api-reference/business-solutions/cms/data-items/query-data-items).
557
+
558
+
559
+ ### Select an authorized site inside the app
560
+
561
+ For multi-site operations, the project owner may set `settings.selectableSiteIds`
562
+ to a comma-separated list of up to 100 distinct Wix Site IDs. Discover IDs with
563
+ `sites.list`, then explicitly approve the sites in project configuration. This is
564
+ not an account-wide wildcard. Save and verify the changed configuration again.
565
+
566
+ All site operations accept optional `siteId` when it occurs in that configured
567
+ list. Omission uses `settings.siteId` as before; an explicit unlisted ID is rejected
568
+ before network access. `sites.list` stays account-scoped and rejects this override.
569
+ Each request gets its own site header without changing configuration or another
570
+ request's binding. The host authorization callback receives the original input,
571
+ including siteId, and must authorize that user's access to the requested site and
572
+ business object. Hide unauthorized sites in the app's picker as well.
573
+
574
+ This is the same text configuration and operation interface for CLI projects.
575
+ Other frameworks must enforce the configured allowed IDs and user authorization
576
+ before choosing the site header. No new Vibe64 server or gateway is involved.
577
+
578
+
579
+ ### Filtered CMS content and references
580
+
581
+ `cmsItems.list` also accepts native `filter`, `sort`, `fields`,
582
+ `returnTotalCount` and `includeReferences` options. They use the same Read Data
583
+ Items permission and project-owned site connection as unfiltered queries:
584
+
585
+ ```js
586
+ const page = await connections.invoke({
587
+ ...owner,
588
+ integrationId: "wix",
589
+ operation: "cmsItems.list",
590
+ input: {
591
+ collectionId: "Articles",
592
+ filter: { published: true },
593
+ sort: [{ fieldName: "title", order: "ASC" }],
594
+ fields: ["title", "author"],
595
+ includeReferences: [{ field: "author", limit: 1 }],
596
+ returnTotalCount: true,
597
+ limit: 20,
598
+ offset: 0
599
+ }
600
+ });
601
+ ```
602
+
603
+ Use field keys from the collection schema, not display labels. Wix evaluates
604
+ its query-language operators; JSKIT validates the request shape without rewriting
605
+ those operators. Filters must be serializable JSON objects within 100KB. Sorts
606
+ accept up to 100 fields with ASC/DESC order; projection accepts up to 1000 fields.
607
+ An empty projection requests all fields. Reference expansion accepts up to 100
608
+ configurations with a reference/multi-reference field and optional limit of 1–1000.
609
+ Wix defaults that limit to 50; an expanded reference may therefore be incomplete.
610
+ Use `includeReferences`, not the deprecated `includeReferencedItems` parameter.
611
+
612
+ `returnTotalCount: true` requests offset-page totals, but `tooManyToCount` can
613
+ mean no total is available. Preserve that distinction instead of showing zero.
614
+ Returned items, related content and paging metadata retain Wix's native shape.
615
+ The app must authorize access to the collection and its related data before
616
+ invoking the operation; a filter is not an authorization policy. Never accept
617
+ arbitrary browser-provided queries as an access-control mechanism.
618
+
619
+ Other frameworks send these same documented request fields using their native
620
+ Wix/HTTP library and backend Env credentials. No editor service or JSKIT runtime
621
+ is required for that implementation.
622
+
623
+ Source: [Wix Query Data Items](https://dev.wix.com/docs/api-reference/business-solutions/cms/data-items/query-data-items).
624
+ The filtered-query case passes in both the source and installed-package suites.
625
+
626
+
627
+ ### Read and edit one CMS item
628
+
629
+ `cmsItems.get` reads a specific `itemId` in a `collectionId`. Set
630
+ `consistentRead: true` when current content is needed immediately after a write.
631
+ The site remains the configured site or an explicitly allowed runtime selection.
632
+
633
+ To edit content, grant the API key the permission identified by Wix as
634
+ `WIX_DATA.PATCH` in [Patch Data Item](https://dev.wix.com/docs/api-reference/business-solutions/cms/data-items/patch-data-item).
635
+ Keep read-only applications on Read Data Items; enable patch permission only for
636
+ apps that need editing. The app must authorize the requested collection, item and
637
+ fields before invoking the write.
638
+
639
+ ```js
640
+ await connections.invoke({
641
+ ...owner,
642
+ integrationId: "wix",
643
+ operation: "cmsItems.patch",
644
+ input: {
645
+ collectionId: "Articles",
646
+ itemId: "article-one",
647
+ conditionFilter: { title: "Original title" },
648
+ fieldModifications: [
649
+ { fieldPath: "title", action: "SET_FIELD", setFieldOptions: { value: "New title" } }
650
+ ]
651
+ }
652
+ });
653
+ ```
654
+
655
+ This uses native PATCH, leaving unspecified fields untouched. Field paths use
656
+ Wix's dot notation. Supply 1–100 modifications, within 100KB of JSON. Supported
657
+ actions are SET_FIELD, REMOVE_FIELD, INCREMENT_FIELD, APPEND_TO_ARRAY and
658
+ REMOVE_FROM_ARRAY. Each action uses its corresponding native options object;
659
+ REMOVE_FIELD has none. False, zero and null values are preserved. Removing an
660
+ array value removes its first matching occurrence according to Wix's semantics.
661
+
662
+ `conditionFilter` maps to Wix's server-side conditional update. Use expected
663
+ field values when concurrent changes should prevent your edit. Omitting it
664
+ performs an unconditional patch; the library does not invent a revision token or
665
+ perform a read-modify-write replacement. On a conflict, reload and let the user
666
+ resolve it. On a timeout or service failure, check the current item before any
667
+ explicit retry, particularly for increments and array appends. JSKIT never
668
+ replays these writes automatically.
669
+
670
+ Responses are checked against the requested item and collection. The same
671
+ backend Env key and project authorization apply in CLI apps and other frameworks;
672
+ use native Wix GET/PATCH calls there. This is not a content-editor UI, schema
673
+ migration or draft/publication system.
674
+
675
+ Controlled source proof: **28/28**, including conditional request shape, wrong
676
+ item/collection rejection, explicit field operations and no write replay. The
677
+ installed-package suite also passes **28/28** through public exports. The added
678
+ permission instruction has expanded rendered proof; compact refresh is pending.
679
+
680
+
681
+ ### Create and replace business locations
682
+
683
+ Grant **Manage Locations** (`LOCATIONS.MANAGE`) in the Wix API key permissions
684
+ for writes. `locations.create` accepts name, IANA timeZone and address, plus
685
+ optional description, contact details, status, locationTypes, businessSchedule
686
+ and extendedFields. `locations.update` additionally requires locationId and the
687
+ current exact revision string from `locations.get`. IDs and revisions are never
688
+ converted to numbers. Both operations require the project-owned site binding.
689
+
690
+ **Update replaces the complete writable location.** Read it first and send every
691
+ writable field you want retained. Do not treat this operation as a patch. Remove
692
+ read-only id/default/archived from the returned object, pass id as locationId,
693
+ keep revision, and preserve optional fields such as phone, businessSchedule and
694
+ extendedFields. Change only the intended values in that complete object. A stale
695
+ revision must be resolved by re-reading the location; there is no automatic retry.
696
+ An archived location cannot be updated.
697
+
698
+ ```js
699
+ const { location } = await connections.invoke({
700
+ ...owner, integrationId: "wix", operation: "locations.get",
701
+ input: { locationId: "01234567-89ab-cdef-0123-456789abcdef" }
702
+ });
703
+ const { id, default: isDefault, archived, locationType, ...writable } = location;
704
+ await connections.invoke({
705
+ ...owner, integrationId: "wix", operation: "locations.update",
706
+ input: { ...writable, locationId: id, name: "Updated studio name" }
707
+ });
708
+ ```
709
+
710
+ The deprecated locationType field is omitted. The supported locationTypes list
711
+ is retained. Wix currently supports ACTIVE status; changing that is not an
712
+ archive operation. BusinessSchedule is passed in Wix's native structure, with
713
+ up to 100 regular periods and 100 special-hour periods. Wix validates its time
714
+ and schedule semantics. These location hours do not configure Wix Bookings.
715
+ The adapter checks address shape, coordinates and timezone and preserves native
716
+ extension data. New properties not represented by the adapter must be handled
717
+ explicitly before using full replacement; do not silently strip unknown data.
718
+
719
+ If creation times out, inspect the locations before explicitly retrying to avoid
720
+ a duplicate. Native create/update responses preserve the location and revision;
721
+ update responses must match the requested location ID. The framework owns app
722
+ user authorization, and the same calls work from a CLI-owned Node backend or
723
+ through another framework's native Wix client.
724
+
725
+ Sources: [Create Location](https://dev.wix.com/docs/api-reference/business-management/locations/create-location),
726
+ [Update Location](https://dev.wix.com/docs/api-reference/business-management/locations/update-location).
727
+ Source suite **29/29** covers native create/PUT bodies, preserved optional fields,
728
+ exact revisions, invalid coordinates/timezones, response identity and no retries.
729
+ The installed-package suite passes29/29 through public exports; these latest
730
+ instructions have expanded rendered proof; compact refresh remains pending. Archive/default-location controls are described below.
731
+
732
+
733
+ ### Archive or select the default location
734
+
735
+ `locations.archive` and `locations.setDefault` each accept only `locationId`
736
+ (and an explicitly allowed siteId where configured). Both require Manage Locations.
737
+ They make one native POST request and verify the returned location ID and resulting
738
+ archived/default flag. The application must authorize these administrative changes.
739
+ For example:
740
+
741
+ ```js
742
+ await connections.invoke({
743
+ ...owner, integrationId: "wix", operation: "locations.setDefault",
744
+ input: { locationId: "01234567-89ab-cdef-0123-456789abcdef" }
745
+ });
746
+ ```
747
+
748
+ Only one location can be default for a site. Wix prevents archiving that location;
749
+ select another default deliberately before trying to archive it. Archiving sets
750
+ archived=true, does not change status, and prevents further location updates.
751
+ These controls do not delete bookings or reconfigure their schedules. No supported
752
+ public restore endpoint was established from the reviewed API documentation, so
753
+ this adapter does not offer a guessed unarchive operation. Do not promise undo.
754
+ After an uncertain result, read the location before a deliberate retry.
755
+
756
+ Sources: [Archive Location](https://dev.wix.com/docs/api-reference/business-management/locations/archive-location),
757
+ [Set Default Location](https://dev.wix.com/docs/api-reference/business-management/locations/set-default-location).
758
+ Controlled source suite **30/30** passes; installed-package proof remains29/29
759
+ until the next refresh. Tests include request placement, resulting state, identity,
760
+ provider refusal and host-denied writes. No live site has been modified.
761
+
762
+
763
+ ### Create a booking service
764
+
765
+ `bookingServices.create` accepts a native `service` object within 100KB of JSON,
766
+ using Manage Bookings on the configured site. It creates appointment, class or
767
+ course services with explicit name, type, defaultCapacity, onlineBooking and
768
+ payment settings. The adapter checks required relationships and preserves the
769
+ native remaining fields; Wix validates those fields and referenced resources.
770
+
771
+ ```js
772
+ await connections.invoke({
773
+ ...owner, integrationId: "wix", operation: "bookingServices.create",
774
+ input: { service: {
775
+ type: "APPOINTMENT", name: "Consultation", defaultCapacity: 1,
776
+ onlineBooking: { enabled: true, requireManualApproval: false },
777
+ payment: { rateType: "FIXED", fixed: { price: { value: "50.25", currency: "AUD" } },
778
+ options: { inPerson: true, online: false } },
779
+ staffMemberIds: [staffResourceId],
780
+ schedule: { availabilityConstraints: { sessionDurations: [30] } },
781
+ category: { id: categoryId }
782
+ } }
783
+ });
784
+ ```
785
+
786
+ Obtain the staff resource and category IDs with bookingStaff.list and
787
+ bookingCategories.list on the selected site, as shown below. Despite its name, staffMemberIds takes resource IDs,
788
+ not staff member IDs. Appointments need at least one staff resource and positive
789
+ session durations in minutes, with capacity1. Classes and courses take capacity
790
+ 1–1000; create their sessions separately and do not send appointment durations.
791
+ Services without category assignment are not visible on the live Wix site.
792
+ The connector does not auto-create staff, categories or scheduled sessions.
793
+
794
+ Choose FIXED, VARIED, CUSTOM or NO_FEE. Fixed/varied amounts are positive decimal
795
+ strings with up to two decimal places and an ISO currency. Even free services
796
+ must select an in-person or online payment option. Online payment requires fixed
797
+ or varied pricing and online booking enabled. Deposits additionally require a
798
+ deposit amount and in-person payment disabled. Manual approval cannot be combined
799
+ with pricing-plan payment. Subscription-priced courses are not implemented here.
800
+
801
+ Do not supply generated service IDs/revisions or existing add-on groups during
802
+ creation. For varied appointment durations, the supplied sessionDurations remain
803
+ mandatory, but Wix actually uses the service variants for pricing/availability;
804
+ creating the service does not configure those variants. Add-ons also require their
805
+ own creation workflow. Those workflows remain open rather than implied by success.
806
+
807
+ Authorization stays with the application, and no provider write is retried.
808
+ If a request times out, inspect existing services before an explicit retry to
809
+ avoid duplicates. A successful response returns the native service ID and
810
+ revision. This configures how the service may be paid for; it does not charge a
811
+ customer or establish an online payment provider. CLI and other frameworks can
812
+ send the same service object to the native Wix endpoint.
813
+
814
+ Source: [Wix Create Service](https://dev.wix.com/docs/api-reference/business-solutions/bookings/services/services-v2/create-service).
815
+ Source proof **31/31** includes all three service types, required payment/staff/
816
+ duration checks, native price preservation and no replay. Latest installed-package
817
+ proof remains29/29 and the added inline setup sentence requires rendered refresh.
818
+
819
+
820
+ ### Select service categories and staff
821
+
822
+ With **Read Bookings - Public Data**, use `bookingCategories.list` and
823
+ `bookingStaff.list` to fill your application's service-creation selectors.
824
+ Both accept limit1–100 (default20) and a returned cursor. Results retain native
825
+ `pagingMetadata`; fetch the next page explicitly until exhausted.
826
+
827
+ ```js
828
+ const categories = await connections.invoke({
829
+ ...owner, integrationId: "wix", operation: "bookingCategories.list"
830
+ });
831
+ const staff = await connections.invoke({
832
+ ...owner, integrationId: "wix", operation: "bookingStaff.list"
833
+ });
834
+ // Let the authorized administrator choose a category.id and staffMember.resourceId.
835
+ ```
836
+
837
+ Category discovery uses Categories V2. Staff discovery uses the documented V1
838
+ query, explicitly filters serviceProvider=true and requests RESOURCE_DETAILS at
839
+ the request's top level. This returns bookable staff, not the whole company
840
+ staff directory. Native staff IDs are preserved, but **service creation uses
841
+ resourceId**, not id. The adapter rejects a staff result missing that required
842
+ resource identity rather than offering an unusable selection. Resource/schedule
843
+ information is preserved for the framework; these queries do not create or
844
+ change staff working hours. An empty response means no choices are available,
845
+ not a successful automatic service setup.
846
+
847
+ The app owns the selectors and their authorization. Both operations also work
848
+ with explicit allowlisted site selection and the same portable project settings.
849
+ Read results can contain staff details; expose only what the user's role needs.
850
+ The remaining runtime and CLI guidance applies without an editor dependency.
851
+
852
+ Sources: [Query Categories](https://dev.wix.com/docs/api-reference/business-solutions/bookings/services/categories-v2/query-categories),
853
+ [Query Staff Members](https://dev.wix.com/docs/api-reference/business-solutions/bookings/staff-members/staff-members/query-staff-members).
854
+ Source suite **32/32** covers cursor and native-body placement, resource identity,
855
+ empty choices and rejection of an unsupported staff filter. Installed-package and
856
+ latest inline setup rendering still need refresh after these additions.
857
+
858
+
859
+ ### Update pricing and booking settings
860
+
861
+ `bookingServices.update` also accepts payment, onlineBooking, defaultCapacity,
862
+ staffMemberIds and schedule.availabilityConstraints. The same serviceId, exact
863
+ revision string and Manage Bookings permission apply. Read the service first,
864
+ retain the current nested settings and change only the intended values:
865
+
866
+ ```js
867
+ const { service } = await connections.invoke({
868
+ ...owner, integrationId: "wix", operation: "bookingServices.get",
869
+ input: { serviceId }
870
+ });
871
+ await connections.invoke({
872
+ ...owner, integrationId: "wix", operation: "bookingServices.update",
873
+ input: { serviceId, revision: service.revision,
874
+ payment: { ...service.payment,
875
+ fixed: { ...service.payment.fixed, price: { value: "75.10", currency: "AUD" } }
876
+ }
877
+ }
878
+ });
879
+ ```
880
+
881
+ The example assumes an existing FIXED-price service. Deliberately changing rate
882
+ type also requires compatible rate and payment-option fields; Wix checks those
883
+ relationships against the existing service. Remove provider-computed read-only
884
+ payment data before writing it. The adapter bounds native JSON and request shape,
885
+ while Wix validates service-specific rules. False online-booking settings and
886
+ zero buffer time are preserved. Staff selections use resource IDs from the staff
887
+ lookup; the connector accepts1–100 IDs.
888
+
889
+ Appointment availability constraints can set sessionDurations and
890
+ timeBetweenSessions. Change sessionDurations only for appointments without varied
891
+ pricing based on session length. For varied-duration appointments, configure the
892
+ variants instead. Classes/courses get their durations from scheduled sessions.
893
+ The library does not fetch the service implicitly to infer its type; the app
894
+ must choose appropriate settings from its preceding read.
895
+
896
+ This operation rejects locations and addOnGroups: Wix requires dedicated
897
+ Set Service Locations and add-on operations. It does not create calendar events,
898
+ change staff working-hour schedules or resolve revision conflicts automatically.
899
+ Source: [Update Service](https://dev.wix.com/docs/api-reference/business-solutions/bookings/services/services-v2/update-service).
900
+ Source suite **33/33** passes, including native nested values, exact revision,
901
+ empty settings, invalid JSON and stale writes. Installed-package proof remains
902
+ 29/29 until refreshed for these additions.
903
+
904
+
905
+ ### Replace a service's locations
906
+
907
+ `bookingServices.setLocations` uses Manage Bookings and takes the full replacement
908
+ locations list. Omitting an existing location removes it from the service. The app
909
+ must show that effect to its authorized administrator before invoking the operation.
910
+
911
+ ```js
912
+ await connections.invoke({
913
+ ...owner, integrationId: "wix", operation: "bookingServices.setLocations",
914
+ input: { serviceId,
915
+ locations: [{ type: "BUSINESS", business: { id: businessLocationId } }],
916
+ removedLocationAction: "KEEP_AT_CURRENT_LOCATION"
917
+ }
918
+ });
919
+ ```
920
+
921
+ Use BUSINESS with business.id from locations.list; CUSTOM with a complete native
922
+ custom.address object; or CUSTOMER with no business/custom details. The connector
923
+ accepts up to100 entries. It requires removedLocationAction explicitly, even when
924
+ adding locations, so removing one later cannot silently choose a session policy.
925
+ KEEP_AT_CURRENT_LOCATION preserves future sessions at their old venue: the business
926
+ must still be able to provide access there. MOVE_TO_LOCATION requires moveToLocation
927
+ in the same location format and moves future affected sessions to that destination.
928
+ Wix does not support mixing these choices per session in this operation. Past
929
+ sessions and sessions at customer-defined locations are not relocated.
930
+
931
+ Participant notifications default off. To notify affected participants, explicitly
932
+ set notifyParticipants=true and optionally notificationMessage (up to2000 characters).
933
+ A message without that opt-in is rejected. This can notify real people when called
934
+ against a live site; the application owns the user confirmation for that action.
935
+ There is no automatic retry or invented revision field for this endpoint. After an
936
+ uncertain response, inspect the service and affected sessions before deciding what
937
+ to do next. Returned service identity is checked against serviceId.
938
+
939
+ Source: [Set Service Locations](https://dev.wix.com/docs/api-reference/business-solutions/bookings/services/services-v2/set-service-locations).
940
+ Source suite **34/34** includes both session decisions, explicit notification,
941
+ location details, wrong service results and one-attempt provider failure. All use
942
+ fixtures. Package/rendered proof still requires the next refresh.
943
+
944
+
945
+ ### Service choices before booking
946
+
947
+ `bookingServices.getVariants({ serviceId })` retrieves native options and variants
948
+ for the selected service through the project-owned site connection. The response
949
+ field is `serviceVariants`, not `serviceOptionsAndVariants`. Preserve its option
950
+ IDs, choices, revision and decimal price strings. The generated application's
951
+ own form displays the choices and collects participants per choice; Vibe64 does
952
+ not maintain a separate catalogue or expose the API key to that form.
953
+
954
+ Use the selected service ID from `bookingServices.list` or `.get`. The API key
955
+ needs the service-options read permission (`BOOKINGS.SERVICE_OPTIONS_AND_VARIANTS_READ`);
956
+ the standard options lookup is documented under Read Bookings - Public Data.
957
+ If permission is missing, edit the key's permissions in Wix Account Settings >
958
+ API Keys, update the project's Env value if Wix issues a replacement, and verify
959
+ again. A failed lookup is not silently converted to “no variants”: surface the
960
+ provider error and check service configuration before offering a booking.
961
+
962
+ CLI callers use the same invocation and existing Env-backed connection as the
963
+ other site operations. Other frameworks call Wix's native endpoint with their
964
+ project-owned key and site header. No additional Vibe64 service is required.
965
+
966
+ The lookup feeds the explicit availability and booking selections below.
967
+ The generated app owns the form and authorization. Confirmation is an explicit operation described below; creation does not
968
+ automatically confirm or charge a booking.
969
+
970
+ References: [lookup by service ID](https://dev.wix.com/docs/api-reference/business-solutions/bookings/services/service-options-and-variants/get-service-options-and-variants-by-service-id),
971
+ [single-service booking flow](https://dev.wix.com/docs/api-reference/business-solutions/bookings/flow-single-service-booking).
972
+ Source suite **35/35** passed with controlled transport, including exact endpoint,
973
+ site header, preserved choices/prices, mismatched service rejection, malformed
974
+ responses, host denial and an unretried 404. Installed-package proof was refreshed: **35/35** passed (719ms) using an
975
+ offline-installed tarball in the isolated consumer, including this new operation.
976
+ Tarball SHA1: `529b9da1227db1489b359161d2393414948d75ac`. No generated app or live provider was used.
977
+
978
+
979
+ ### Apply service choices and add-ons
980
+
981
+ `bookingServices.listAddOnGroups({ serviceId })` returns all service groups under
982
+ `addOnGroupsDetails`, with the native display order, prompts, labels, prices and
983
+ selection limits. An empty list is valid. This uses Read Bookings - Public Data.
984
+ Render each group's `groupName`/`prompt` and enforce `maxNumberOfAddOns`; enforce
985
+ `maxQuantity` for quantity add-ons. Preserve `groupId` and each `addOnId`.
986
+
987
+ For appointment `availability.list` and `.get`, pass `customerChoices`:
988
+
989
+ ```json
990
+ { "customerChoices": { "addOnIds": ["12345678-9abc-def0-1234-56789abcdef0"] } }
991
+ ```
992
+
993
+ A duration variant can use `durationInMinutes`. With add-ons, prefer supplying
994
+ only their IDs so Wix calculates duration. If both are supplied, the duration
995
+ must include all selected add-on durations. Repeat the same choices when
996
+ revalidating the selected slot. Duration-range services do not support this
997
+ object; omit it and use their native configured range. Class event availability
998
+ continues to use capacity and event IDs, not appointment customerChoices.
999
+
1000
+ For `bookings.create`, use either fixed `totalParticipants` (defaults to 1 when
1001
+ neither field is supplied) or variant groups:
1002
+
1003
+ ```json
1004
+ {
1005
+ "participantsChoices": {
1006
+ "serviceChoices": [
1007
+ { "numberOfParticipants": 2, "choices": [
1008
+ { "optionId": "12345678-9abc-def0-1234-56789abcdef0", "custom": "Child" }
1009
+ ] }
1010
+ ]
1011
+ }
1012
+ }
1013
+ ```
1014
+
1015
+ Use `duration: { "minutes": 90 }` instead of `custom` for a duration choice.
1016
+ Copy these values from the selected service's variants. Do not send both a
1017
+ custom and duration value, repeat an option within a group, or supply a fixed
1018
+ total alongside variant groups. The adapter supports up to 20 participant groups,
1019
+ 5 choices each, and 1000 participants in total. Preview choice-ID/date-time/
1020
+ participant-range variants are not yet exposed by this operation. Wix validates
1021
+ whether the choices actually exist for the selected service; an invalid-choice
1022
+ failure is surfaced without retrying the create.
1023
+
1024
+ Optional `bookedAddOns` is an array of `{ id, groupId?, quantity? }`, mapping the
1025
+ lookup's `addOnId` to `id`. Omit quantity for duration add-ons. Use quantity only
1026
+ for quantity-based add-ons within their returned limit. Do not send calculated
1027
+ prices, duration or read-only labels in this object. This records selected
1028
+ add-ons; it does not create or edit the add-on catalogue.
1029
+
1030
+ The same JSON inputs work from the JSKIT CLI/runtime. For another framework,
1031
+ use its native HTTP client: `customerChoices` is top-level in the availability
1032
+ body; `participantsChoices` and `bookedAddOns` belong inside `booking`. Never
1033
+ forward the fixed total too. Keep credentials in the project's Env and validate
1034
+ the app user's choices on the backend before making the request.
1035
+
1036
+ References: [add-on lookup](https://dev.wix.com/docs/api-reference/business-solutions/bookings/services/services-v2/list-add-on-groups-by-service-id),
1037
+ [availability](https://dev.wix.com/docs/api-reference/business-solutions/bookings/time-slots/time-slots-v2/list-availability-time-slots),
1038
+ [booking](https://dev.wix.com/docs/api-reference/business-solutions/bookings/bookings/bookings-writer-v2/create-booking).
1039
+ Source **37/37** passed (790ms), including native availability/booking bodies,
1040
+ mutually exclusive totals, invalid groups/selections, preserved add-on discovery
1041
+ and single-attempt provider errors. Installed proof remains the previous
1042
+ 35-case snapshot; the new two cases and newest inline copy need their final
1043
+ package/rendering refresh. No live booking, customer notification or payment was
1044
+ performed.
1045
+
1046
+
1047
+ ### Custom-checkout booking decisions
1048
+
1049
+ Use these operations only for the generated application's **custom checkout**.
1050
+ For Wix eCommerce checkout, let Wix's order flow update booking confirmation.
1051
+ The app backend owns payment evidence, the administrator's authorization and the
1052
+ checkout decision; do not accept payment status directly from a browser.
1053
+
1054
+ - `bookings.confirmOrDecline({ bookingId, paymentStatus })` asks Wix to evaluate
1055
+ payment, availability and business approval. Supply the actual payment status:
1056
+ UNDEFINED, NOT_PAID, PAID, PARTIALLY_PAID, REFUNDED or EXEMPT. Preserve the returned
1057
+ CONFIRMED, PENDING or DECLINED result and any doubleBooked flag. There is no
1058
+ revision or notification input on this native endpoint. It is not a force-confirm
1059
+ operation and does not collect or refund money.
1060
+ - `bookings.confirm({ bookingId, revision, notifyParticipants?, message? })` is an
1061
+ explicit administrator decision. **It does not validate availability**, so it
1062
+ can confirm a conflicting booking. Recheck availability and present the conflict
1063
+ before the administrator acts. Eligible original statuses are PENDING, CREATED
1064
+ and WAITING_LIST. Use the exact revision from the current booking.
1065
+ - `bookings.decline` takes the same inputs and explicitly declines an eligible
1066
+ booking. Notification defaults to false; a message requires notifyParticipants
1067
+ true. Declining does not refund a payment.
1068
+
1069
+ These require Manage Bookings. Enable that permission on the project's Wix key
1070
+ only when the app needs booking management. The public editor's configuration
1071
+ instructions identify the permission; the generated app supplies the booking
1072
+ review/decision UI. CLI users call the same operations. Other frameworks POST to
1073
+ Wix's native endpoints with their own HTTP library, project key and site header.
1074
+
1075
+ Read the exact booking before acting and reconcile uncertain failures before a
1076
+ retry. The adapter sends one request and rejects a mismatched booking response.
1077
+ It never starts checkout, marks an unrelated order paid or silently overrides
1078
+ booking policies. Existing Wix flow-control settings on externally created
1079
+ bookings may still affect Wix's automatic decision.
1080
+
1081
+ References: [automatic decision](https://dev.wix.com/docs/api-reference/business-solutions/bookings/bookings/bookings-writer-v2/confirm-or-decline-booking),
1082
+ [explicit confirm](https://dev.wix.com/docs/api-reference/business-solutions/bookings/bookings/bookings-writer-v2/confirm-booking),
1083
+ [explicit decline](https://dev.wix.com/docs/api-reference/business-solutions/bookings/bookings/bookings-writer-v2/decline-booking).
1084
+ Controlled source **38/38** passed (786ms), covering all three endpoints, precise
1085
+ revision strings, notification opt-in, all automatic result states, mismatched
1086
+ identity, invalid input, host denial and single-attempt failure. Package evidence
1087
+ still covers the prior35-case snapshot; final refresh remains pending.
1088
+
1089
+
1090
+ ### Reschedule appointments and classes
1091
+
1092
+ `bookings.reschedule({ bookingId, revision, slot, notifyParticipants?, message? })`
1093
+ moves an existing appointment or class booking. Query the exact booking first,
1094
+ check `allowedActions.reschedule`, authorize its owner and recheck the chosen
1095
+ availability. Use the exact current revision. Manage Bookings is required.
1096
+
1097
+ For an appointment, supply the full selected slot with `serviceId`, `scheduleId`,
1098
+ local `startDate` and `endDate` (`YYYY-MM-DDThh:mm:ss`), IANA `timezone` and the
1099
+ selected resource/location details. Keep the original service/schedule identity
1100
+ when moving the booking. V2 time-slot results use `localStartDate`/`localEndDate`;
1101
+ map these to the writer's `startDate`/`endDate`, using the service's schedule ID.
1102
+ For a class, pass only `{ "eventId": "the-selected-event-id" }` as slot; it must
1103
+ belong to the same class. Wix does not support moving course bookings this way.
1104
+
1105
+ Notifications default to false and a message requires explicit notification.
1106
+ The adapter does not forward policy/availability overrides or change add-ons
1107
+ while rescheduling. Wix validates the move; surface unavailable-slot or stale
1108
+ revision errors and reload the booking before retrying. Keep the returned status:
1109
+ a custom-checkout booking may still need the explicit confirmation step.
1110
+
1111
+ CLI and other-framework users use the same portable inputs and project Env
1112
+ credentials; the native request body is `{ revision, slot, participantNotification }`.
1113
+ The generated app owns the slot picker, confirmation and error handling.
1114
+
1115
+ [Wix rescheduling reference](https://dev.wix.com/docs/api-reference/business-solutions/bookings/bookings/bookings-writer-v2/reschedule-booking).
1116
+ Source **39/39** passed (808ms), including full appointment/event requests,
1117
+ notifications, rejected overrides, invalid timing, mismatched booking identity and
1118
+ single-attempt provider failure. Final installed and rendered refresh remains
1119
+ pending; no live changes were made.
1120
+
1121
+
1122
+ ### Send a customer to Wix-hosted checkout
1123
+
1124
+ Use Cart V2 for new integrations. Wix's Cart V1/Checkout V1 retirement is scheduled
1125
+ for 1 February 2027. This adapter does not add the deprecated checkout entity.
1126
+
1127
+ In Wix Account Settings > API Keys, edit the project's key and select **Write
1128
+ Carts V2 (PII)** for creation and **Read Carts V2 (PII)** for checkout URLs. The
1129
+ Create Cart reference also lists **Manage eCommerce - Admin Permissions** as an
1130
+ alternative permission. Keep the selected site's ID in project configuration.
1131
+ Publish the Wix site and configure its checkout/payment methods before expecting
1132
+ a working payment page. SITE_NOT_PUBLISHED or CHECKOUT_PAGE_NOT_FOUND requires
1133
+ fixing the Wix site, not adding an OAuth app or a Vibe64 gateway.
1134
+
1135
+ The app backend calls `carts.create` with a nonempty `catalogItems` array and an
1136
+ optional `note`. Each item has `quantity` and `catalogReference`:
1137
+
1138
+ ```json
1139
+ {
1140
+ "catalogItems": [{
1141
+ "quantity": 1,
1142
+ "catalogReference": {
1143
+ "appId": "13d21c63-b5ec-5912-8397-c3a5ddb27a97",
1144
+ "catalogItemId": "01234567-89ab-cdef-0123-456789abcdef"
1145
+ }
1146
+ }]
1147
+ }
1148
+ ```
1149
+
1150
+ For Wix Bookings, use the **created booking ID** as catalogItemId and the Bookings
1151
+ app ID shown above. For Wix Stores, use app ID `215238eb-22a5-4c36-9e7b-e7c08025e04e`,
1152
+ the product ID and the appropriate catalogue version's `options`. Native options
1153
+ are preserved; do not convert V1/V3 variant selections into each other. The adapter
1154
+ sets the web sales channel and lets Wix resolve catalogue prices. It does not
1155
+ accept caller price overrides, custom-price items, coupons or membership payment
1156
+ in this operation. These remain separate capability gaps if the app needs them.
1157
+
1158
+ Store `response.cart.id` against the authorized customer in the generated app.
1159
+ Call `carts.getCheckoutUrl({ cartId })`, then redirect the customer to the returned
1160
+ `checkoutUrl`. Wix may return its site's custom checkout domain; the adapter
1161
+ accepts HTTPS URLs without embedded credentials. The app must authorize access to
1162
+ the cart before requesting or exposing its URL. A cart ID is not a permission.
1163
+
1164
+ Cart creation and URL retrieval do not prove payment. Use the order's actual
1165
+ payment status through the order operations before granting paid access. For
1166
+ Wix-hosted booking checkout, Wix updates booking confirmation; do not call the
1167
+ custom-checkout confirmation methods as a second step. Inventory/catalogue
1168
+ errors must be shown to the customer; the adapter does not silently remove items
1169
+ or retry creation.
1170
+
1171
+ JSKIT CLI/runtime consumers use the same calls with text/Env configuration. Other
1172
+ frameworks POST `{ cart: { source: { channelType: "WEB" }, note? }, catalogItems }`
1173
+ to `/ecom/v2/carts`, then POST `{}` to `/ecom/v2/carts/{cartId}/get-checkout-url`
1174
+ with the project-owned key and `wix-site-id` header. They can use their framework's
1175
+ normal redirect response. No card details, provider credentials or Vibe64 billing
1176
+ service are passed through the browser.
1177
+
1178
+ References: [Create Cart](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/cart-v2/create-cart),
1179
+ [Get Checkout URL](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/cart-v2/get-checkout-url),
1180
+ [Cart V2 migration guide](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/cart-v2/migration-guide).
1181
+ Controlled source **40/40 passed** (823ms), including exact V2 bodies/paths, native
1182
+ options and money preservation, key/site ownership, invalid URLs/inputs, host
1183
+ denial and unretried inventory failure. The installed snapshot is still35/35;
1184
+ newest runtime and inline-copy package/browser proof remains pending. No real
1185
+ checkout or payment was created.
1186
+
1187
+ Installed-package refresh: **40/40 passed** (802ms) in the isolated offline consumer.
1188
+ Tarball SHA1: `8523ad1db0917879df986d91c5800994dc233291`. This supersedes the earlier35-case
1189
+ installed snapshot for all current runtime operations. Latest browser proof is
1190
+ recorded separately.
1191
+
1192
+ Latest public-editor verification: fresh-build expanded form/lifecycle **1/1**
1193
+ passed (27.4s). It explicitly asserts Cart V2 permission labels, add-on guidance
1194
+ and direct confirmation's availability warning, plus configuration save/reload
1195
+ and connect/reconnect/disconnect. Compact latest-copy refresh remains pending.
1196
+
1197
+
1198
+ ### Read recorded order fulfillments
1199
+
1200
+ Grant **Read Orders** to the site's API key. Call
1201
+ `orderFulfillments.list` with `{ orderId }` through the existing connection service.
1202
+ The native GET `/ecom/v1/fulfillments/orders/{orderId}` returns
1203
+ `orderWithFulfillments`, containing the order ID and its `fulfillments` array.
1204
+ An empty array is valid. Native tracking, custom fulfillment information, status
1205
+ and completion fields are preserved alongside line-item IDs and quantities.
1206
+
1207
+ Your app must authorize the customer's access to the order before invocation.
1208
+ Keep the selected site bound to the same project connection. Handling status is
1209
+ not evidence of payment or a substitute for the order's fulfillment quantities.
1210
+ This reader does not create shipments or send shipping notifications. Use the
1211
+ separate create/update operations documented below to record shipments or change
1212
+ tracking. Those writes can trigger Wix shipping notifications.
1213
+ CLI and other frameworks use the same project Env key, site header and native
1214
+ endpoint; there is no Vibe64 service dependency.
1215
+
1216
+ Reference: [Wix List Fulfillments For Single Order](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/orders/order-fulfillments/list-fulfillments-for-single-order).
1217
+
1218
+
1219
+ ### Record shipments and update tracking
1220
+
1221
+ In Wix account API-key permissions, add **Manage Orders** for the selected site
1222
+ and update the same private Env reference if replacing the key. No callback is
1223
+ needed. Your application authorizes the order and confirms the intended shipment.
1224
+
1225
+ `orderFulfillments.create({ orderId, lineItems: [{ id, quantity }], trackingInfo })`
1226
+ posts `{ fulfillment: { lineItems, trackingInfo } }` to
1227
+ `/ecom/v1/fulfillments/orders/{orderId}/create-fulfillment`. Obtain line-item IDs
1228
+ from `orders.get`; this adapter requires explicit quantities. Wix requires an
1229
+ APPROVED order and checks unfulfilled quantities. It assigns the fulfillment ID.
1230
+ If supplying tracking, include `trackingNumber` and `shippingProvider`. Custom
1231
+ carriers also need `trackingLink`; Wix generates links for its predefined carriers.
1232
+
1233
+ `orderFulfillments.update({ orderId, fulfillmentId, trackingInfo, status, completed })`
1234
+ PATCHes `/ecom/v1/fulfillments/{fulfillmentId}/orders/{orderId}`. Pass only changed
1235
+ fields. Tracking number/provider cannot be removed. Optional `lineItems` replaces
1236
+ the shipment items with explicit quantities; Wix disallows this once completed.
1237
+ Status values are Pending, Accepted, Ready, In_Delivery and Fulfilled; these are
1238
+ handling labels, not payment evidence. The adapter also preserves explicit false
1239
+ for `completed`. Custom fulfillment fields and deletion are not supplied yet.
1240
+
1241
+ Creation or changed tracking can send buyer emails according to Wix site settings.
1242
+ There is no invented suppress-email option. Order fulfillment totals update
1243
+ asynchronously; read the order again when the app needs the latest totals. Never
1244
+ retry an uncertain write automatically: list existing fulfillments and reconcile
1245
+ before a deliberate retry. A 409 can indicate an existing tracking number.
1246
+ Other frameworks use these same native requests and project Env credentials.
1247
+
1248
+ References: [Create](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/orders/order-fulfillments/create-fulfillment),
1249
+ [Update](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/orders/order-fulfillments/update-fulfillment).