@wix/agent-skills 1.35.0 → 1.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/package.json +1 -1
  2. package/skills/wix-app/references/CODE_QUALITY.md +1 -1
  3. package/skills/wix-app/references/EDITOR_REACT_COMPONENT.md +27 -29
  4. package/skills/wix-app/references/dashboard-page/DRAFT_TEMPLATE.md +5 -3
  5. package/skills/wix-app/references/editor-react-component/ANIMATED-COMPONENTS.md +1 -1
  6. package/skills/wix-app/references/editor-react-component/COMPONENT-CONTRACT.md +26 -25
  7. package/skills/wix-app/references/editor-react-component/CSS-GUIDELINES.md +12 -42
  8. package/skills/wix-app/references/editor-react-component/DESIGN-STATES.md +9 -20
  9. package/skills/wix-app/references/editor-react-component/MANIFEST-ERRORS.md +5 -4
  10. package/skills/wix-app/references/editor-react-component/PARTS.md +1 -1
  11. package/skills/wix-app/references/editor-react-component/PROPS-VS-CSS.md +1 -1
  12. package/skills/wix-app/references/editor-react-component/VECTOR-ART.md +95 -0
  13. package/skills/wix-app/references/editor-react-component/VISUAL-QUALITY.md +39 -0
  14. package/skills/wix-docs/references/CALLING.md +1 -1
  15. package/skills/wix-headless-kit/guides/api-run.md +1 -1
  16. package/skills/wix-headless-kit/install/pins.json +1 -1
  17. package/skills/wix-headless-templates/blog/seed/seed-blog.mjs +1 -1
  18. package/skills/wix-headless-templates/donations/app/wix/donations/campaigns.ts +0 -1
  19. package/skills/wix-headless-templates/donations/app/wix/donations/donate.ts +1 -1
  20. package/skills/wix-headless-templates/donations/project/src/wix/donations/campaigns.ts +0 -1
  21. package/skills/wix-headless-templates/donations/project/src/wix/donations/donate.ts +1 -1
  22. package/skills/wix-headless-templates/donations/rest/campaigns.ts +0 -1
  23. package/skills/wix-headless-templates/donations/rest/donate.ts +1 -1
  24. package/skills/wix-headless-templates/events/seed/seed-events.mjs +1 -1
  25. package/skills/wix-headless-templates/faq/INSTRUCTIONS.md +1 -1
  26. package/skills/wix-headless-templates/faq/app/wix/faq/faq.ts +2 -2
  27. package/skills/wix-headless-templates/faq/project/src/wix/faq/faq.ts +2 -2
  28. package/skills/wix-headless-templates/faq/rest/faq.ts +2 -2
  29. package/skills/wix-headless-templates/faq/seed/SEED.md +1 -1
  30. package/skills/wix-headless-templates/faq/seed/read-site.mjs +1 -1
  31. package/skills/wix-headless-templates/faq/seed/seed-faq.mjs +5 -5
  32. package/skills/wix-headless-templates/forms/app/wix/forms/forms.ts +2 -2
  33. package/skills/wix-headless-templates/forms/app/wix/forms/submissions.ts +2 -2
  34. package/skills/wix-headless-templates/forms/project/src/wix/forms/forms.ts +2 -2
  35. package/skills/wix-headless-templates/forms/project/src/wix/forms/submissions.ts +2 -2
  36. package/skills/wix-headless-templates/members/seed/read-site.mjs +1 -1
  37. package/skills/wix-headless-templates/pricing-plans/app/wix/pricing-plans/plan-access.ts +1 -1
  38. package/skills/wix-headless-templates/pricing-plans/project/src/wix/pricing-plans/plan-access.ts +1 -1
  39. package/skills/wix-headless-templates/pricing-plans/rest/plan-access.ts +1 -1
  40. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/menu.ts +0 -1
  41. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/menu.ts +0 -1
  42. package/skills/wix-headless-templates/restaurants/rest/menu.ts +0 -1
  43. package/skills/wix-headless-templates/shared/rest/client.ts +1 -1
  44. package/skills/wix-headless-templates/shared/seed/site.mjs +2 -1
  45. package/skills/wix-manage/references/google-ads/get-campaign-suggestions.md +0 -1
  46. package/skills/wix-manage/references/google-ads/install-and-create-account.md +0 -1
  47. package/skills/wix-manage/references/rich-content/ricos-converter-service.md +1 -1
  48. package/skills/wix-manage/references/sites/upload-static-site.md +8 -6
  49. package/skills/wix-replatform/resources/rp-mapper/wix-business-solutions-taxonomy.md +5 -5
  50. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/docs-survey.json +0 -9
  51. package/skills/wix-vibe-headless/references/blog/INSTRUCTIONS.md +1 -1
@@ -0,0 +1,95 @@
1
+ # Vector Art
2
+
3
+ Use this reference when a component shows an icon or other SVG the site owner
4
+ can replace. Fixed glyphs stay inline per
5
+ CSS-GUIDELINES.md "SVG Icons".
6
+
7
+ ## The Prop
8
+
9
+ Import `VectorArt` from `@wix/editor-react-types`. All fields are required; keep
10
+ the whole object, never flatten it to a URL string.
11
+
12
+ Declare it at the top level or as an array-item field, never in `elementProps`,
13
+ which stays `className` only:
14
+
15
+ ```ts
16
+ export type FeatureRowProps = {
17
+ icon?: VectorArt;
18
+ elementProps?: { featureRowIcon?: { className?: string } };
19
+ };
20
+ ```
21
+
22
+ ## Render and Style
23
+
24
+ The icon is a named part per `PARTS.md`. Inject `svgContent` unmodified (no
25
+ `.replace()` or added attributes). Mark it `aria-hidden="true"` beside a visible label, or name the
26
+ control with `a11y.ariaLabel` per `ACCESSIBILITY.md`.
27
+
28
+ ```tsx
29
+ {icon && (
30
+ <span
31
+ {...elementProps?.featureRowIcon}
32
+ className={clsx('feature-row-icon', styles.icon, elementProps?.featureRowIcon?.className)}
33
+ aria-hidden="true"
34
+ dangerouslySetInnerHTML={{ __html: icon.svgContent }}
35
+ />
36
+ )}
37
+ ```
38
+
39
+ Declare the controls per CSS-GUIDELINES.md "SVG Icons", plus `--icon-rotation`
40
+ via `rotate`. Add no border, background, or padding.
41
+
42
+ ```css
43
+ .icon {
44
+ --icon-size: 24px;
45
+ --icon-color: #116dff;
46
+ --icon-rotation: 0deg;
47
+ display: block;
48
+ inline-size: var(--icon-size);
49
+ block-size: var(--icon-size);
50
+ fill: var(--icon-color);
51
+ rotate: var(--icon-rotation);
52
+ }
53
+
54
+ .icon svg {
55
+ display: block;
56
+ inline-size: 100%;
57
+ block-size: 100%;
58
+ }
59
+ ```
60
+
61
+ With several icons, give each part its own class and prefixed properties;
62
+ shared names merge into one control. Only the property-free `svg` rule may be
63
+ shared (`.startIcon svg, .endIcon svg`).
64
+
65
+ ## Defaults
66
+
67
+ Populate all six fields in `defaultProps`; keep them there, with no second
68
+ fallback in JSX. Never invent a `uri` or use a `data:` URI.
69
+
70
+ ```ts
71
+ export const defaultProps = {
72
+ icon: {
73
+ uri: '417ddd_00f94d35a8f84b959241a5d4293ee772.svg',
74
+ viewBox: '0 0 200 200',
75
+ contentBox: '10 10 180 180',
76
+ colors: {},
77
+ contentType: 'shape',
78
+ svgContent:
79
+ '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200" data-type="shape"><path d="M100 190c49.706 0 90-40.294 90-90s-40.294-90-90-90-90 40.294-90 90 40.294 90 90 90"/></svg>',
80
+ },
81
+ } as const satisfies Omit<FeatureRowProps, 'id' | 'className'>;
82
+ ```
83
+
84
+ For further slots substitute `uri` and the path `d` (same `viewBox` and `contentBox`):
85
+
86
+ | `uri` | Shape | path `d` |
87
+ | --- | --- | --- |
88
+ | `417ddd_3d6ddf28b43e45499ea8557b8d963c79.svg` | Arch | `M100 10c49.704 0 90 37.654 90 84.102V190H10V94.102C10 47.654 50.294 10 100 10` |
89
+ | `417ddd_c4e65c20d3844ffd97c9b2551ce7d269.svg` | Heptagon | `m100 10 72.174 35.651L190 125.76 140.054 190H59.946L10 125.759l17.826-80.108z` |
90
+
91
+ ## Checklist
92
+
93
+ - [ ] A replaceable icon is a `VectorArt` prop, not an inline `<svg>` or URL string.
94
+ - [ ] Each icon is its own named part injecting `svgContent` unmodified, with prefixed `--icon-*` properties.
95
+ - [ ] `defaultProps` carries all six fields with a `uri` from the pool.
@@ -0,0 +1,39 @@
1
+ # Visual Quality
2
+
3
+ Use this reference for a component's default look: hierarchy, spacing, and
4
+ foreground/background contrast.
5
+
6
+ **Visual intent.** When the request specifies how the component should look —
7
+ mood, palette, layout style, or a reference — follow that direction. Default to a modern, refined look — intentional layout, pleasing proportions, polished and deliberate styling.
8
+
9
+ ## Default Visual Quality
10
+
11
+ Create a clear hierarchy with at least two techniques that fit the component:
12
+ a defined surface, border or soft shadow, type scale or weight, spacing, an
13
+ accent, or visible interaction states. Use these neutral defaults unless the
14
+ request or existing design provides better values:
15
+
16
+ - 16px or larger body text, 14px or larger labels, and 600–700 weight for titles
17
+ - 8–16px spacing inside controls and 16–32px spacing inside containers
18
+ - 8–12px corner radii for cards and controls; `50%` for circular media
19
+ - a subtle border or soft shadow when a card, panel, or control needs separation
20
+ - touch targets at least 44 by 44px and visible keyboard focus states
21
+
22
+ ### Foreground and Background Ownership
23
+
24
+ If the component is a self-contained block (card, panel, banner, accordion item), give the root a background. An inline control meant to blend in (link, ghost button, icon button) may leave it transparent.
25
+
26
+ - On a transparent root, don't hardcode text or icon colors; inherit them from the parent.
27
+ - Set the background and main text/icon color together on the same element. Any secondary text (captions, hints, icons) must still be readable against that same background.
28
+ - If an interactive state changes the background, set the foreground color in that state too. Don't assume a color inherited from a parent or from a previous state will still look right on the new background.
29
+ - In every default and interactive state, meet WCAG AA contrast: 4.5:1 for body text and 3:1 for large text and UI controls.
30
+
31
+ A neutral owned surface may use a light background with dark primary and
32
+ secondary foregrounds, plus one accessible accent. The exact colors are not a
33
+ contract; the contrast relationship is.
34
+
35
+ ## Checklist
36
+
37
+ - [ ] Visual containers have deliberate hierarchy rather than bare scaffolding.
38
+ - [ ] Every explicit foreground has a known contrasting background; transparent
39
+ components inherit foregrounds from their host.
@@ -68,7 +68,7 @@ Append `.md` to read:
68
68
  - [`rest-api-authentication`](https://dev.wix.com/docs/api-reference/articles/authentication/rest-api-authentication) — headers, token kinds
69
69
  - [`retrieve-tokens`](https://dev.wix.com/docs/api-reference/business-management/headless/authentication/retrieve-tokens) — the `/oauth2/token` contract, all grant types
70
70
  - [`about-authentication`](https://dev.wix.com/docs/go-headless/authentication/about-authentication) — visitor vs member sessions
71
- - [`create-an-oauth-app-for-visitors-and-members`](https://dev.wix.com/docs/go-headless/getting-started/setup/authentication/create-an-oauth-app-for-visitors-and-members) — where the client id comes from
71
+ - [`create-oauth-app`](https://dev.wix.com/docs/api-reference/business-management/headless/oauth-apps/create-oauth-app) — where the client id comes from
72
72
  - [`set-up-a-headless-client`](https://dev.wix.com/docs/go-headless/authentication/setup/set-up-a-headless-client) — wiring the client
73
73
 
74
74
  ## Dynamic Site Context — "what IS this site?"
@@ -69,7 +69,7 @@ visitor tokens only, which cover what a visitor may see and nothing here.
69
69
 
70
70
  Unchanged from SKILL.md step 2 and its Verticals table: the brief names the business, the table
71
71
  names the solutions it needs. Read each solution's `{TEMPLATES}/{solution}/INSTRUCTIONS.md` for
72
- what it covers and `{TEMPLATES}/{solution}/seed/SEED.md` for what a seeded site holds.
72
+ what it covers and `{TEMPLATES}/{solution}/seed/SEED.md` (`{solution}` is the template folder name, e.g. `storefront`, `bookings`) for what a seeded site holds.
73
73
 
74
74
  A brief that needs no solution (a game, a landing page, a tool) is a run of two steps: the site
75
75
  (step 2, with no `seedOptions`) and the frontend (step 5). No apps, no seed.
@@ -3,6 +3,6 @@
3
3
  "@wix/create-new": "0.0.124",
4
4
  "typescript": "5.8.3",
5
5
  "templates": {
6
- "ref": "v1.35.0"
6
+ "ref": "v1.36.0"
7
7
  }
8
8
  }
@@ -118,7 +118,7 @@ export async function installBlogApp(ctx) {
118
118
 
119
119
  // Every post create needs a REAL author memberId — a fabricated id fails with
120
120
  // "memberIds ... do not exist". A provisioned site has the owner as members[0].
121
- // docs: https://dev.wix.com/docs/api-reference/crm/members-contacts/members/members/list-members.md
121
+ // docs: https://dev.wix.com/docs/api-reference/crm/members-contacts/members/member-management/members/list-members.md
122
122
  export async function getAuthorMemberId(ctx) {
123
123
  const r = await req(ctx, "/members/v1/members?fieldsets=PUBLIC&paging.limit=1", { method: "GET" });
124
124
  const id = r.members?.[0]?.id;
@@ -22,7 +22,6 @@ const settingsApi = wixModule(ecommerceSettings);
22
22
  // The metrics list is EMPTY on a campaign nobody has donated to yet, and the campaign entity carries
23
23
  // formatted amounts but no currency code — so a fresh site would format nothing. The site's currency
24
24
  // comes from the eCommerce settings then (BUSINESS_INFO), read once per process; "" when refused.
25
- // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/ecommerce-settings/get-ecommerce-settings.md
26
25
  let siteCurrencyPromise: Promise<string> | null = null;
27
26
  function siteCurrency(): Promise<string> {
28
27
  siteCurrencyPromise ??= settingsApi
@@ -6,7 +6,7 @@
6
6
  // (shared with the REST twin); this file is the transport only. Copy as-is.
7
7
  // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/cart-v2/create-cart.md
8
8
  // docs: https://dev.wix.com/docs/api-reference/business-management/headless/redirects/create-redirect-session.md
9
- // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/orders/get-order.md
9
+ // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/orders/orders/get-order.md
10
10
  import { cartV2 as cartV2Module, orders as ordersModule } from "@wix/ecom";
11
11
  import { redirects as redirectsModule } from "@wix/redirects";
12
12
  import { wixModule } from "../sdk";
@@ -22,7 +22,6 @@ const settingsApi = wixModule(ecommerceSettings);
22
22
  // The metrics list is EMPTY on a campaign nobody has donated to yet, and the campaign entity carries
23
23
  // formatted amounts but no currency code — so a fresh site would format nothing. The site's currency
24
24
  // comes from the eCommerce settings then (BUSINESS_INFO), read once per process; "" when refused.
25
- // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/ecommerce-settings/get-ecommerce-settings.md
26
25
  let siteCurrencyPromise: Promise<string> | null = null;
27
26
  function siteCurrency(): Promise<string> {
28
27
  siteCurrencyPromise ??= settingsApi
@@ -6,7 +6,7 @@
6
6
  // (shared with the REST twin); this file is the transport only. Copy as-is.
7
7
  // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/cart-v2/create-cart.md
8
8
  // docs: https://dev.wix.com/docs/api-reference/business-management/headless/redirects/create-redirect-session.md
9
- // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/orders/get-order.md
9
+ // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/orders/orders/get-order.md
10
10
  import { cartV2 as cartV2Module, orders as ordersModule } from "@wix/ecom";
11
11
  import { redirects as redirectsModule } from "@wix/redirects";
12
12
  import { wixModule } from "../sdk";
@@ -16,7 +16,6 @@ const BASE = "/donation-campaigns/v2/donation-campaigns";
16
16
  // A campaign nobody has donated to yet has no metrics entry, and the entity carries no currency code:
17
17
  // the site's currency then comes from the eCommerce settings, read once.
18
18
  // GET /_api/ecommerce-settings/v1/ecommerce-settings?fields=BUSINESS_INFO → { ecommerceSettings: { businessInfo: { currency } } }
19
- // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/ecommerce-settings/get-ecommerce-settings.md
20
19
  let siteCurrencyPromise: Promise<string> | null = null;
21
20
  function siteCurrency(): Promise<string> {
22
21
  siteCurrencyPromise ??= wixRequest<Raw>("/_api/ecommerce-settings/v1/ecommerce-settings", { method: "GET", query: { fields: ["BUSINESS_INFO"] } })
@@ -6,7 +6,7 @@
6
6
  // order yourself, never hand-build a checkout URL.
7
7
  // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/cart-v2/create-cart.md
8
8
  // docs: https://dev.wix.com/docs/api-reference/business-management/headless/redirects/create-redirect-session.md
9
- // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/orders/get-order.md
9
+ // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/orders/orders/get-order.md
10
10
  import { wixRequest } from "../../shared/rest/client.js";
11
11
  import {
12
12
  cartBody,
@@ -85,7 +85,7 @@ function buildRegistration(ev) {
85
85
  // Forms API AFTER the event exists (Create Event ignores form.controls; probed live 2026-09-28). The
86
86
  // control lands as a count input (options "0".."N") plus a names list capped at N — the shape the
87
87
  // site's form reader (events-core toRsvpForm) reads its max from — and takes effect at once.
88
- // docs: https://dev.wix.com/docs/api-reference/business-solutions/events/event-management/forms/add-control.md
88
+ // docs: https://dev.wix.com/docs/api-reference/business-solutions/events/event-management/form/add-control.md
89
89
  export async function addGuestControl(ctx, eventId, guests) {
90
90
  const n = Number(guests);
91
91
  if (!Number.isInteger(n) || n < 1) return false;
@@ -296,7 +296,7 @@ without telling the owner.
296
296
 
297
297
  ## Verification caveats
298
298
 
299
- The FAQ API's reference exists (`https://dev.wix.com/docs/rest/business-management/faq-app/…`) and the
299
+ The FAQ API's reference exists (`https://dev.wix.com/docs/api-reference/business-management/faq-app/…`) and the
300
300
  shipped calls follow it: `POST /faq/v2/categories/query`, `POST /faq/v2/question-entries/query`, the
301
301
  `RICH_CONTENT` content format and the `SHARE_LINKS` field set. Not confirmed on a live site, and
302
302
  guarded in the code:
@@ -3,8 +3,8 @@
3
3
  // rules and mappers live in ./faq-core (shared with the REST twin in templates/faq/rest/); this file
4
4
  // is the transport only. Copy as-is; extend by adding functions, not by editing these. The vertical
5
5
  // is read-only: authoring stays in the dashboard.
6
- // docs: https://dev.wix.com/docs/rest/business-management/faq-app/faq/category-v2/query-categories.md
7
- // docs: https://dev.wix.com/docs/rest/business-management/faq-app/faq/question-entry-v2/query-question-entries.md
6
+ // docs: https://dev.wix.com/docs/api-reference/business-management/faq-app/category-v2/query-categories.md
7
+ // docs: https://dev.wix.com/docs/api-reference/business-management/faq-app/question-entry-v2/query-question-entries.md
8
8
  import { category as categoryModule, questionEntry as questionModule } from "@wix/faq";
9
9
  import { wixModule } from "../sdk";
10
10
  import { imgSrc } from "../media";
@@ -3,8 +3,8 @@
3
3
  // rules and mappers live in ./faq-core (shared with the REST twin in templates/faq/rest/); this file
4
4
  // is the transport only. Copy as-is; extend by adding functions, not by editing these. The vertical
5
5
  // is read-only: authoring stays in the dashboard.
6
- // docs: https://dev.wix.com/docs/rest/business-management/faq-app/faq/category-v2/query-categories.md
7
- // docs: https://dev.wix.com/docs/rest/business-management/faq-app/faq/question-entry-v2/query-question-entries.md
6
+ // docs: https://dev.wix.com/docs/api-reference/business-management/faq-app/category-v2/query-categories.md
7
+ // docs: https://dev.wix.com/docs/api-reference/business-management/faq-app/question-entry-v2/query-question-entries.md
8
8
  import { category as categoryModule, questionEntry as questionModule } from "@wix/faq";
9
9
  import { wixModule } from "../sdk";
10
10
  import { imgSrc } from "../media";
@@ -5,8 +5,8 @@
5
5
  // them is not documented — the reference shows an elevated example — so a 403 here means the site's
6
6
  // read needs a server-side path, not that the body is wrong (INSTRUCTIONS.md, verification caveats).
7
7
  // Porting: keep the paths, keep the bodies, port the core once.
8
- // docs: https://dev.wix.com/docs/rest/business-management/faq-app/faq/category-v2/query-categories.md
9
- // docs: https://dev.wix.com/docs/rest/business-management/faq-app/faq/question-entry-v2/query-question-entries.md
8
+ // docs: https://dev.wix.com/docs/api-reference/business-management/faq-app/category-v2/query-categories.md
9
+ // docs: https://dev.wix.com/docs/api-reference/business-management/faq-app/question-entry-v2/query-question-entries.md
10
10
  import { wixRequest } from "../../shared/rest/client.js";
11
11
  import { imgSrc } from "../../shared/rest/media.js";
12
12
  import {
@@ -82,7 +82,7 @@ partial re-seed.
82
82
 
83
83
  ## Verification caveats
84
84
 
85
- The FAQ API's reference pages exist (`dev.wix.com/docs/rest/business-management/faq-app/…`) and
85
+ The FAQ API's reference pages exist (`dev.wix.com/docs/api-reference/business-management/faq-app/…`) and
86
86
  every path, verb, and body here follows them; the following were not checked on a live site:
87
87
 
88
88
  - Whether the create endpoints answer 409 on a duplicate title/question or create a second copy. The
@@ -3,7 +3,7 @@
3
3
  import { runReader } from "../../shared/seed/read-site.mjs";
4
4
 
5
5
  const FAQ_APP_ID = "14c92d28-031e-7910-c9a8-a670011e062d";
6
- const D = "https://dev.wix.com/docs/rest/business-management/faq-app/faq";
6
+ const D = "https://dev.wix.com/docs/api-reference/business-management/faq-app";
7
7
 
8
8
  await runReader({
9
9
  vertical: "faq",
@@ -25,7 +25,7 @@ import { readFileSync } from "node:fs";
25
25
 
26
26
  const API = "https://www.wixapis.com";
27
27
  const FAQ_APP_ID = "14c92d28-031e-7910-c9a8-a670011e062d";
28
- const D = "https://dev.wix.com/docs/rest/business-management/faq-app/faq";
28
+ const D = "https://dev.wix.com/docs/api-reference/business-management/faq-app";
29
29
  /** The API's page cap (CursorPaging.limit max 100). */
30
30
  const PAGE_LIMIT = 100;
31
31
  /** sortOrder step — increments of 10 leave room to insert between items later (the reference's own tip). */
@@ -134,14 +134,14 @@ export async function installFaqApp(ctx) {
134
134
  }
135
135
 
136
136
  // Existing categories, straight from the query (the source of truth for what persisted).
137
- // docs: https://dev.wix.com/docs/rest/business-management/faq-app/faq/category-v2/query-categories.md
137
+ // docs: https://dev.wix.com/docs/api-reference/business-management/faq-app/category-v2/query-categories.md
138
138
  export async function readCategories(ctx) {
139
139
  const r = await reqRetryOnce(ctx, "/faq/v2/categories/query", { body: { query: { cursorPaging: { limit: PAGE_LIMIT } } } });
140
140
  return (r.categories ?? []).map((c) => ({ id: rawId(c), title: c.title ?? "", sortOrder: typeof c.sortOrder === "number" ? c.sortOrder : null }));
141
141
  }
142
142
 
143
143
  // Every existing question (paged by cursor; PLAIN_TEXT keeps the read light — only the text is compared).
144
- // docs: https://dev.wix.com/docs/rest/business-management/faq-app/faq/question-entry-v2/query-question-entries.md
144
+ // docs: https://dev.wix.com/docs/api-reference/business-management/faq-app/question-entry-v2/query-question-entries.md
145
145
  export async function readQuestions(ctx) {
146
146
  const out = [];
147
147
  let cursor = null;
@@ -164,7 +164,7 @@ export async function readQuestions(ctx) {
164
164
  // 2. Idempotency — an already-present title (a partial-failure re-run, Wix's sample content) is kept.
165
165
  // New categories append after the existing ones: sortOrder = max(existing) + 10, +20, …
166
166
  // Body is NESTED: { category: { title, sortOrder } } → { category: { id, … } }.
167
- // docs: https://dev.wix.com/docs/rest/business-management/faq-app/faq/category-v2/create-category.md
167
+ // docs: https://dev.wix.com/docs/api-reference/business-management/faq-app/category-v2/create-category.md
168
168
  export async function ensureCategories(ctx, titles) {
169
169
  let existing = await readCategories(ctx);
170
170
  const byTitle = () => new Map(existing.map((c) => [norm(c.title), c]));
@@ -196,7 +196,7 @@ export async function ensureCategories(ctx, titles) {
196
196
 
197
197
  // One question, one call (the SDK exports no bulk create). Body is NESTED: { questionEntry: { … } } →
198
198
  // { questionEntry: { id, slug, … } }. `question` and `categoryId` are required; the answer is a oneof.
199
- // docs: https://dev.wix.com/docs/rest/business-management/faq-app/faq/question-entry-v2/create-question-entry.md
199
+ // docs: https://dev.wix.com/docs/api-reference/business-management/faq-app/question-entry-v2/create-question-entry.md
200
200
  export async function createQuestion(ctx, { question, categoryId, sortOrder, labels, answer }, idx) {
201
201
  const body = {
202
202
  questionEntry: {
@@ -13,8 +13,8 @@
13
13
  // implicit visitor access so a published site can render its own forms. Do NOT add a backend, a
14
14
  // connector token, or auth.elevate to make a form load.
15
15
  //
16
- // docs: https://dev.wix.com/docs/sdk/business-solutions/forms/forms/get-form.md
17
- // docs: https://dev.wix.com/docs/sdk/business-solutions/forms/forms/list-forms.md
16
+ // docs: https://dev.wix.com/docs/api-reference/crm/forms/form-schemas/get-form.md
17
+ // docs: https://dev.wix.com/docs/api-reference/crm/forms/form-schemas/list-forms.md
18
18
  // docs: https://dev.wix.com/docs/api-reference/crm/forms/form-schemas/about-form-fields.md
19
19
  import { wixFetch } from "../sdk";
20
20
  import { imgSrc } from "../media";
@@ -13,8 +13,8 @@
13
13
  // scope and 403s. The resolved create IS the confirmation — show a thank-you; the entry appears
14
14
  // in the owner's dashboard. A site that must LIST what visitors submitted needs `cms` instead.
15
15
  //
16
- // docs: https://dev.wix.com/docs/sdk/business-solutions/forms/submissions/create-submission.md
17
- // docs: https://dev.wix.com/docs/sdk/business-solutions/forms/submissions/get-media-upload-url.md
16
+ // docs: https://dev.wix.com/docs/api-reference/crm/forms/form-submissions/create-submission.md?apiView=SDK
17
+ // docs: https://dev.wix.com/docs/api-reference/crm/forms/form-submissions/get-media-upload-url.md?apiView=SDK
18
18
  // docs: https://dev.wix.com/docs/api-reference/crm/forms/form-submissions/about-submission-values.md
19
19
  // docs: https://dev.wix.com/docs/api-reference/business-management/headless/redirects/create-redirect-session.md
20
20
  import { submissions as submissionsModule } from "@wix/forms";
@@ -13,8 +13,8 @@
13
13
  // implicit visitor access so a published site can render its own forms. Do NOT add a backend, a
14
14
  // connector token, or auth.elevate to make a form load.
15
15
  //
16
- // docs: https://dev.wix.com/docs/sdk/business-solutions/forms/forms/get-form.md
17
- // docs: https://dev.wix.com/docs/sdk/business-solutions/forms/forms/list-forms.md
16
+ // docs: https://dev.wix.com/docs/api-reference/crm/forms/form-schemas/get-form.md
17
+ // docs: https://dev.wix.com/docs/api-reference/crm/forms/form-schemas/list-forms.md
18
18
  // docs: https://dev.wix.com/docs/api-reference/crm/forms/form-schemas/about-form-fields.md
19
19
  import { wixFetch } from "../sdk";
20
20
  import { imgSrc } from "../media";
@@ -13,8 +13,8 @@
13
13
  // scope and 403s. The resolved create IS the confirmation — show a thank-you; the entry appears
14
14
  // in the owner's dashboard. A site that must LIST what visitors submitted needs `cms` instead.
15
15
  //
16
- // docs: https://dev.wix.com/docs/sdk/business-solutions/forms/submissions/create-submission.md
17
- // docs: https://dev.wix.com/docs/sdk/business-solutions/forms/submissions/get-media-upload-url.md
16
+ // docs: https://dev.wix.com/docs/api-reference/crm/forms/form-submissions/create-submission.md?apiView=SDK
17
+ // docs: https://dev.wix.com/docs/api-reference/crm/forms/form-submissions/get-media-upload-url.md?apiView=SDK
18
18
  // docs: https://dev.wix.com/docs/api-reference/crm/forms/form-submissions/about-submission-values.md
19
19
  // docs: https://dev.wix.com/docs/api-reference/business-management/headless/redirects/create-redirect-session.md
20
20
  import { submissions as submissionsModule } from "@wix/forms";
@@ -3,7 +3,7 @@
3
3
  import { runReader } from "../../shared/seed/read-site.mjs";
4
4
 
5
5
  const MEMBERS_AREA_APP_ID = "14cc59bc-f0b7-15b8-e1c7-89ce41d0e0c9";
6
- const D = "https://dev.wix.com/docs/api-reference/crm/members-contacts/members/members";
6
+ const D = "https://dev.wix.com/docs/api-reference/crm/members-contacts/members/member-management/members";
7
7
 
8
8
  await runReader({
9
9
  vertical: "members",
@@ -12,7 +12,7 @@
12
12
  // manual client (React SPA, lib) — the shared seam holds a VISITOR token; pass a call bound to the
13
13
  // member's client instead, e.g. from templates/members' client.ts strategy:
14
14
  // `createClient({ auth: membersAuth, modules: { orders } }).orders.memberListOrders`.
15
- // docs: https://dev.wix.com/docs/api-reference/business-solutions/pricing-plans/orders/member-list-orders.md
15
+ // docs: https://dev.wix.com/docs/api-reference/business-solutions/pricing-plans/orders/member-orders-service-list-orders.md
16
16
  import { orders as ordersModule } from "@wix/pricing-plans";
17
17
  import { wixModule } from "../sdk";
18
18
  import { hasPlanAccess, memberOrdersQuery, type MemberOrdersQuery } from "./plan-access-core";
@@ -12,7 +12,7 @@
12
12
  // manual client (React SPA, lib) — the shared seam holds a VISITOR token; pass a call bound to the
13
13
  // member's client instead, e.g. from templates/members' client.ts strategy:
14
14
  // `createClient({ auth: membersAuth, modules: { orders } }).orders.memberListOrders`.
15
- // docs: https://dev.wix.com/docs/api-reference/business-solutions/pricing-plans/orders/member-list-orders.md
15
+ // docs: https://dev.wix.com/docs/api-reference/business-solutions/pricing-plans/orders/member-orders-service-list-orders.md
16
16
  import { orders as ordersModule } from "@wix/pricing-plans";
17
17
  import { wixModule } from "../sdk";
18
18
  import { hasPlanAccess, memberOrdersQuery, type MemberOrdersQuery } from "./plan-access-core";
@@ -4,7 +4,7 @@
4
4
  // after the members vertical's rest/auth.ts login (`loggedInHint()` true) — and is refused for a
5
5
  // visitor, so callers check the session first (the store does) and never call for a visitor.
6
6
  // Porting: keep the path and the query string; the rule is one line in the core.
7
- // docs: https://dev.wix.com/docs/api-reference/business-solutions/pricing-plans/orders/member-list-orders.md
7
+ // docs: https://dev.wix.com/docs/api-reference/business-solutions/pricing-plans/orders/member-orders-service-list-orders.md
8
8
  import { wixRequest } from "../../shared/rest/client.js";
9
9
  import { hasPlanAccess, memberOrdersQuery, type MemberOrdersQuery } from "../app/wix/pricing-plans/plan-access-core.js";
10
10
  import type { Raw } from "../app/wix/pricing-plans/plans-core.js";
@@ -9,7 +9,6 @@
9
9
  // docs: https://dev.wix.com/docs/api-reference/business-solutions/restaurants/menus/items/item-modifier-groups/list-modifier-groups.md
10
10
  // docs: https://dev.wix.com/docs/api-reference/business-solutions/restaurants/menus/items/item-modifiers/list-modifiers.md
11
11
  // docs: https://dev.wix.com/docs/api-reference/business-solutions/restaurants/menus/items/item-labels/list-labels.md
12
- // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/ecommerce-settings/get-ecommerce-settings.md
13
12
  import {
14
13
  menus as menusModule,
15
14
  sections as sectionsModule,
@@ -9,7 +9,6 @@
9
9
  // docs: https://dev.wix.com/docs/api-reference/business-solutions/restaurants/menus/items/item-modifier-groups/list-modifier-groups.md
10
10
  // docs: https://dev.wix.com/docs/api-reference/business-solutions/restaurants/menus/items/item-modifiers/list-modifiers.md
11
11
  // docs: https://dev.wix.com/docs/api-reference/business-solutions/restaurants/menus/items/item-labels/list-labels.md
12
- // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/ecommerce-settings/get-ecommerce-settings.md
13
12
  import {
14
13
  menus as menusModule,
15
14
  sections as sectionsModule,
@@ -6,7 +6,6 @@
6
6
  // port the core once. Entities carry `id` here (the SDK spells it `_id`); the core accepts both.
7
7
  // docs: https://dev.wix.com/docs/api-reference/business-solutions/restaurants/menus/menus/list-menus.md
8
8
  // docs: https://dev.wix.com/docs/api-reference/business-solutions/restaurants/menus/items/items/list-items.md
9
- // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/ecommerce-settings/get-ecommerce-settings.md
10
9
  import { wixRequest } from "../../shared/rest/client.js";
11
10
  import { imgSrc } from "../../shared/rest/media.js";
12
11
  import {
@@ -14,7 +14,7 @@
14
14
  // server (a Python/PHP/Go port) — the SHOPPER'S SESSION, one token set per shopper. Never one
15
15
  // process-wide token for everyone: that is one shared cart for all visitors.
16
16
  // This is the only part of a port that isn't line-for-line.
17
- // docs: https://dev.wix.com/docs/go-headless/coding/authentication/visitors.md
17
+ // docs: https://dev.wix.com/docs/go-headless/authentication/visitors/authenticate-visitors-rest.md
18
18
  import { WIX_CLIENT_ID } from "./config.js";
19
19
 
20
20
  export const WIX_API_BASE = "https://www.wixapis.com";
@@ -7,7 +7,8 @@ const API = "https://www.wixapis.com";
7
7
  // cannot be repriced afterwards. A new site starts in the currency of the account that created
8
8
  // it, not the business's. Reads can report the old currency for a few seconds after this returns;
9
9
  // that lag is expected and self-resolves.
10
- // docs: https://dev.wix.com/docs/rest/business-management/site-properties/properties/update-site-properties
10
+ // No reference page documents this PATCH any more (Update Site Properties left the docs). The docs
11
+ // cover the same field only under Update Business Region, a different endpoint and body.
11
12
  export async function setSiteCurrency(ctx, currency) {
12
13
  if (!/^[A-Z]{3}$/.test(currency)) throw new Error(`currency must be a 3-letter ISO code, got "${currency}"`);
13
14
  const res = await fetch(`${API}/site-properties/v4/properties`, {
@@ -107,4 +107,3 @@ Returns `lowOffer` / `mediumOffer` / `highOffer`, each with `incentiveId`, `awar
107
107
  - [Get Keyword Theme Suggestions](https://dev.wix.com/docs/api-reference/business-management/marketing/ads/google-ads/google-suggestion-v1/get-keyword-theme-suggestions)
108
108
  - [Get Geo Options](https://dev.wix.com/docs/api-reference/business-management/marketing/ads/google-ads/google-suggestion-v1/get-geo-options)
109
109
  - [Get Budget Suggestions](https://dev.wix.com/docs/api-reference/business-management/marketing/ads/google-ads/google-suggestion-v1/get-budget-suggestions)
110
- - [Get Incentives](https://dev.wix.com/docs/api-reference/business-management/marketing/ads/google-ads/google-suggestion-v1/get-incentives)
@@ -152,4 +152,3 @@ Returns `{}`. Errors with `ACCOUNT_NOT_FOUND` if no account exists.
152
152
  - [Account Service](https://dev.wix.com/docs/api-reference/business-management/marketing/ads/google-ads/google-account-v1/introduction)
153
153
  - [Create Account](https://dev.wix.com/docs/api-reference/business-management/marketing/ads/google-ads/google-account-v1/create-account)
154
154
  - [Get Account For Current Site](https://dev.wix.com/docs/api-reference/business-management/marketing/ads/google-ads/google-account-v1/get-account-for-current-site)
155
- - [Get Incentives](https://dev.wix.com/docs/api-reference/business-management/marketing/ads/google-ads/google-suggestion-v1/get-incentives)
@@ -13,7 +13,7 @@ Ricos is Wix's rich content format used across various Wix applications (Blog, S
13
13
  - **Convert to Ricos**: Transform HTML, Markdown, or plain text into a Ricos document
14
14
  - **Convert from Ricos**: Transform a Ricos document back to HTML, Markdown, or plain text
15
15
 
16
- Learn more about [Rich Content](https://dev.wix.com/docs/api-reference/articles/work-with-wix-apis/platform/about-rich-content) and [Ricos document structure](https://dev.wix.com/docs/ricos/getting-started/introduction).
16
+ Learn more about [Rich Content](https://dev.wix.com/docs/api-reference/articles/work-with-wix-apis/platform/about-rich-content) and [Ricos document structure](https://dev.wix.com/docs/api-reference/assets/rich-content/ricos-documents/document-object).
17
17
 
18
18
  ## Required API Endpoints
19
19
 
@@ -476,12 +476,14 @@ If a call fails after publishing, inspect the current snapshot before retrying:
476
476
  the write may have succeeded and only its subsequent verification failed.
477
477
  Avoid repeating a mutation merely because the last call returned an error.
478
478
 
479
- Give the live URL, what changed, what was verified, and any missing assets.
480
- On first authenticated publish (or after claim), also give
481
- `https://manage.wix.com/dashboard/{metaSiteId}` and
482
- [domain connection](../domains/domain-search-purchase-and-connect.md) options
483
- for a Wix-purchased or existing domain. For an unclaimed anonymous site, give
484
- the live URL and private save link instead, not a dashboard link.
479
+ Give the user two links, each on its own line and named for what it is: the
480
+ live site, `{siteUrl}`, and the site's dashboard,
481
+ `https://manage.wix.com/dashboard/{metaSiteId}`. Every publish and every edit
482
+ closes with both. Then what changed, what was verified, any missing assets, and
483
+ [domain connection](../domains/domain-search-purchase-and-connect.md) options:
484
+ a domain bought through Wix, or one the user already owns. For an unclaimed
485
+ anonymous site, give the live URL and private save link instead, not a
486
+ dashboard link.
485
487
 
486
488
  ## Connect a backend
487
489
 
@@ -96,9 +96,9 @@ Primary entities:
96
96
 
97
97
  | Entity | What it does | Docs |
98
98
  | --- | --- | --- |
99
- | `cart` | First phase of the purchase flow; holds line items, buyer references, discounts, and pricing context before checkout | [About the eCommerce Cart API](https://dev.wix.com/docs/rest/business-solutions/e-commerce/purchase-flow/cart/cart/introduction) |
100
- | `current-cart` | Visitor/member scoped cart used in live purchase flows | [About the eCommerce Current Cart API](https://dev.wix.com/docs/sdk/backend-modules/ecom/current-cart/introduction) |
101
- | `checkout` | Second phase of purchase flow; holds calculated prices, tax, billing, shipping, and discount state before order creation | [About the eCommerce Checkout API](https://dev.wix.com/docs/sdk/backend-modules/ecom/checkout/introduction) |
99
+ | `cart` | First phase of the purchase flow; holds line items, buyer references, discounts, and pricing context before checkout | [About the Cart API (Cart V2, replaces the eCommerce Cart API)](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/cart-v2/introduction) |
100
+ | `current-cart` | Visitor/member scoped cart used in live purchase flows | [About the Cart API (Cart V2, its Current Cart service)](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/cart-v2/introduction?apiView=SDK) |
101
+ | `checkout` | Second phase of purchase flow; holds calculated prices, tax, billing, shipping, and discount state before order creation | [About the Cart API (Cart V2, replaces the eCommerce Checkout API)](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/cart-v2/introduction?apiView=SDK) |
102
102
  | `order` | Final commerce record for completed or externally recorded purchases | [About the Orders API](https://dev.wix.com/docs/rest/business-solutions/e-commerce/orders/orders/introduction) |
103
103
  | `order-billing` | Payment capture, void, and refund operations for eCommerce orders | [About the Order Billing API](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/orders/order-billing/introduction) |
104
104
 
@@ -179,7 +179,7 @@ Primary entities:
179
179
  | `ticket-definition` | Ticket type template such as General Admission or VIP | [Event Management introduction](https://dev.wix.com/docs/api-reference/business-solutions/events/event-management/introduction) |
180
180
  | `ticket` | Purchased ticket with guest and check-in state | [About the Tickets API](https://dev.wix.com/docs/api-reference/business-solutions/events/registration/ticketing/tickets/introduction?apiView=SDK) |
181
181
  | `event-order` | Ticket purchase and registration order lifecycle | [About the Orders API](https://dev.wix.com/docs/sdk/backend-modules/events/orders/on-order-initiated) |
182
- | `rsvp` | RSVP response and attendance state for non-ticketed events | [About RSVP API](https://dev.wix.com/docs/sdk/backend-modules/events/rsvp/introduction) |
182
+ | `rsvp` | RSVP response and attendance state for non-ticketed events | [About the RSVP API](https://dev.wix.com/docs/api-reference/business-solutions/events/registration/rsvp-v2/introduction?apiView=SDK) |
183
183
  | `event-guest` | Unified guest record across ticketed and RSVP events | [About the Event Guests API](https://dev.wix.com/docs/api-reference/business-solutions/events/registration/event-guests/introduction?apiView=SDK) |
184
184
  | `events-registration` | Registration layer connecting RSVP, ticketing, and guests | [About Events Registration](https://dev.wix.com/docs/api-reference/business-solutions/events/registration/introduction) |
185
185
 
@@ -212,7 +212,7 @@ Primary entities:
212
212
  | `reservation` | Reservation lifecycle record for a party at a restaurant | [About the Reservations API](https://dev.wix.com/docs/api-reference/business-solutions/restaurants/wix-restaurants-new/reservations/reservations/introduction) |
213
213
  | `restaurant-time-slot` | Availability window for reservation booking | [Reservations API introduction](https://dev.wix.com/docs/rest/business-solutions/restaurants/wix-restaurants-new/reservations/introduction) |
214
214
  | `experience` | Special dining experience such as chef's table or tasting menu | [Experiences API](https://dev.wix.com/docs/api-reference/business-solutions/restaurants/wix-restaurants-new/reservations/experiences/introduction) |
215
- | `restaurant-order-legacy` | Legacy restaurant order model from the original Restaurants Orders app | [About Wix Restaurants Orders](https://dev.wix.com/docs/rest/business-solutions/restaurants/wix-restaurants/orders/introduction) |
215
+ | `restaurant-order-legacy` | Legacy restaurant order model from the original Restaurants Orders app | [Restaurants Online Orders (the legacy Orders docs are removed)](https://dev.wix.com/docs/api-reference/business-solutions/restaurants/online-orders) |
216
216
 
217
217
  Mapper notes:
218
218
  - Restaurants spans multiple subdomains: menus, reservations, and in some cases restaurant ordering.