@wix/agent-skills 1.16.1 → 1.16.3

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 (73) hide show
  1. package/package.json +1 -1
  2. package/skills/wix-app/SKILL.md +72 -8
  3. package/skills/wix-app/references/CODE_QUALITY.md +0 -1
  4. package/skills/wix-app/references/DASHBOARD_MODAL.md +21 -14
  5. package/skills/wix-app/references/DASHBOARD_PAGE.md +30 -184
  6. package/skills/wix-app/references/EDITOR_REACT_COMPONENT.md +14 -6
  7. package/skills/wix-app/references/EMBEDDED_SCRIPT.md +6 -0
  8. package/skills/wix-app/references/WIX_PATTERNS_DOCS.md +172 -0
  9. package/skills/wix-app/references/dashboard-page/WDS_LAYOUT.md +187 -0
  10. package/skills/wix-app/references/editor-react-component/ANIMATED-COMPONENTS.md +32 -2
  11. package/skills/wix-app/references/editor-react-component/COMPONENT-API.md +38 -1
  12. package/skills/wix-app/references/editor-react-component/DESIGN-STATES.md +27 -4
  13. package/skills/wix-app/references/editor-react-component/FUNCTION-HANDLERS.md +167 -0
  14. package/skills/wix-app/references/editor-react-component/MANIFEST-ERRORS.md +19 -0
  15. package/skills/wix-app/references/editor-react-component/PARTS.md +1 -2
  16. package/skills/wix-app/references/editor-react-component/REACT-GUIDELINES.md +2 -2
  17. package/skills/wix-base44-connector/SKILL.md +185 -0
  18. package/skills/wix-base44-connector/scripts/utils.js +212 -0
  19. package/skills/wix-design-system/SKILL.md +19 -15
  20. package/skills/wix-docs/SKILL.md +75 -1
  21. package/skills/wix-manage/SKILL.md +16 -18
  22. package/skills/wix-manage/references/bookings/create-class-service.md +1 -1
  23. package/skills/wix-manage/references/domains/domain-search-purchase-and-connect.md +2603 -0
  24. package/skills/wix-manage/references/events/create-wix-event.md +112 -90
  25. package/skills/wix-manage/references/events/manage-wix-events.md +33 -94
  26. package/skills/wix-manage/references/rich-content/author-ricos-rich-content.md +182 -5
  27. package/skills/wix-manage/references/sites/create-headless-site.md +1 -0
  28. package/skills/wix-manage/references/sites/manage-oauth-apps.md +154 -0
  29. package/skills/wix-manage/references/sites/read-site-context.md +125 -0
  30. package/skills/wix-manage/references/stores/create-product-catalog-v3.md +273 -0
  31. package/skills/wix-vibe-headless/install/deploy.cjs +1 -2
  32. package/skills/wix-vibe-headless/platforms/base44-ecom-light-seed.md +104 -0
  33. package/skills/wix-vibe-headless/platforms/base44-ecom-light.md +74 -0
  34. package/skills/wix-vibe-headless/platforms/base44.md +3 -3
  35. package/skills/wix-vibe-headless/references/blog/seed/SEED.md +1 -1
  36. package/skills/wix-vibe-headless/references/bookings/seed/SEED.md +1 -1
  37. package/skills/wix-vibe-headless/references/events/seed/SEED.md +1 -1
  38. package/skills/wix-vibe-headless/references/portfolio/seed/SEED.md +1 -1
  39. package/skills/wix-vibe-headless/references/pricing-plans/seed/SEED.md +1 -1
  40. package/skills/wix-vibe-headless/references/restaurants/seed/SEED.md +1 -1
  41. package/skills/wix-vibe-headless/references/storefront/INSTRUCTIONS.md +68 -2
  42. package/skills/wix-vibe-headless/references/storefront/app/components/ProductCard.jsx +29 -86
  43. package/skills/wix-vibe-headless/references/storefront/app/components/ProductGrid.jsx +3 -8
  44. package/skills/wix-vibe-headless/references/storefront/app/components/VariantPicker.jsx +78 -105
  45. package/skills/wix-vibe-headless/references/storefront/app/hooks/useProductCard.js +92 -0
  46. package/skills/wix-vibe-headless/references/storefront/app/hooks/useVariantOptions.js +76 -0
  47. package/skills/wix-vibe-headless/references/storefront/seed/SEED.md +1 -1
  48. package/skills/wix-app/references/AUTO_PATTERNS_DASHBOARD.md +0 -326
  49. package/skills/wix-app/references/auto-patterns-dashboard/action-cell.md +0 -115
  50. package/skills/wix-app/references/auto-patterns-dashboard/app-config-structure.md +0 -264
  51. package/skills/wix-app/references/auto-patterns-dashboard/app-context.md +0 -37
  52. package/skills/wix-app/references/auto-patterns-dashboard/bulk-actions.md +0 -86
  53. package/skills/wix-app/references/auto-patterns-dashboard/collection-page-actions.md +0 -119
  54. package/skills/wix-app/references/auto-patterns-dashboard/collection-page.md +0 -103
  55. package/skills/wix-app/references/auto-patterns-dashboard/custom-actions-override.md +0 -76
  56. package/skills/wix-app/references/auto-patterns-dashboard/custom-columns-override.md +0 -82
  57. package/skills/wix-app/references/auto-patterns-dashboard/custom-components-override.md +0 -89
  58. package/skills/wix-app/references/auto-patterns-dashboard/custom-header-override.md +0 -124
  59. package/skills/wix-app/references/auto-patterns-dashboard/custom-sections-override.md +0 -91
  60. package/skills/wix-app/references/auto-patterns-dashboard/custom-slots-override.md +0 -71
  61. package/skills/wix-app/references/auto-patterns-dashboard/entity-page-actions.md +0 -70
  62. package/skills/wix-app/references/auto-patterns-dashboard/entity-page-view-actions.md +0 -73
  63. package/skills/wix-app/references/auto-patterns-dashboard/entity-page.md +0 -98
  64. package/skills/wix-app/references/auto-patterns-dashboard/example-patterns.json +0 -278
  65. package/skills/wix-app/references/auto-patterns-dashboard/pages-configuration.md +0 -94
  66. package/skills/wix-app/references/auto-patterns-dashboard/resolved-action.md +0 -43
  67. package/skills/wix-app/references/auto-patterns-dashboard/sdk-utilities.md +0 -66
  68. package/skills/wix-app/references/auto-patterns-dashboard/views.md +0 -76
  69. package/skills/wix-app/scripts/generate-auto-patterns.js +0 -510
  70. package/skills/wix-manage/references/domains/domain-search-and-purchase.md +0 -437
  71. package/skills/wix-manage/references/stores/create-product-from-image.md +0 -1031
  72. package/skills/wix-manage/references/stores/create-product-with-options-catalog-v3.md +0 -623
  73. package/skills/wix-manage/references/stores/setup-online-store-catalog-v3.md +0 -106
@@ -1,20 +1,19 @@
1
1
  ---
2
2
  name: "Create an Event with the Wix Events API"
3
- description: "Creates an event with the Wix Events V3 API — the required request body, ISO-8601 date and time settings, venue/online/TBD location, RSVP vs ticketed registration, guest capacity, and short vs rich-text descriptions. Covers the exact field shapes and the API's misleading validation messages. Use when the user wants to create an event, set its date, location, description or guest limit, or choose between RSVP and ticketing."
3
+ description: "Creates an event with the Wix Events V3 API — the required request body, ISO-8601 date and time settings, venue/online/TBD location, RSVP vs ticketed registration, guest capacity, short vs rich-text descriptions, ticket tiers and pricing, and recurring series. Covers the exact field shapes and the API's misleading validation messages. Use when the user wants to create an event, set its date, location, description, guest limit or ticket prices, or set up a repeating event."
4
4
  ---
5
5
 
6
6
  # Create an Event with the Wix Events API
7
7
 
8
8
  ## Goal
9
- Create an event on a Wix site — one-off or recurring, RSVP or ticketed — with the Wix Events
10
- V3 API. To publish, cancel, clone, count, add tickets or set up a recurring series, see
9
+ Create an event on a Wix site — one-off or recurring, RSVP or ticketed, with ticket tiers. To
10
+ publish, cancel, clone, update or count events that already exist, see
11
11
  [Manage Wix Events](manage-wix-events.md).
12
12
 
13
13
  ## First: pick the right "Events" API
14
14
 
15
15
  Several unrelated Wix APIs are called "Events". Routing to the wrong one is the most expensive
16
- mistake on this surface, because the wrong API answers plausibly for several calls before
17
- failing.
16
+ mistake here, because the wrong API answers plausibly for several calls before failing.
18
17
 
19
18
  | The user means | API | Base path |
20
19
  | --- | --- | --- |
@@ -23,21 +22,16 @@ failing.
23
22
  | An entry on the marketing plan calendar | Marketing Calendar Event V1 | `/promote/marketing-plan-service/v1/events` |
24
23
  | An automation trigger | Triggered Events | `/automations/v1/events/report` |
25
24
 
26
- A recurring *class or course that guests book* is Bookings, not Wix Events. A recurring
27
- *event series guests attend* is Wix Events.
25
+ A recurring *class or course that guests book* is Bookings. A recurring *event series guests
26
+ attend* is Wix Events.
28
27
 
29
- ## Prerequisite — the Wix Events app must be installed
28
+ ## Prerequisite — the Wix Events app
30
29
 
31
- Every `/events/v3` call against a site without the app returns:
32
-
33
- ```
34
- 428 {"message":"Events app not installed for metaSiteId=...",
35
- "details":{"applicationError":{"code":"WIX_EVENTS_APP_NOT_INSTALLED"}}}
36
- ```
37
-
38
- Install it with appDefId `140603ad-af8d-84a5-2c80-a0f60cb47351` — see
39
- [Install Wix Apps](../app-installation/install-wix-apps.md). Confirm with the user first unless
40
- they already asked for the event to be created.
30
+ Every `/events/v3` call against a site without it returns `428 WIX_EVENTS_APP_NOT_INSTALLED`.
31
+ Install with appDefId `140603ad-af8d-84a5-2c80-a0f60cb47351` via
32
+ `POST /apps-installer-service/v1/app-instance/install`, body
33
+ `{"tenant":{"tenantType":"SITE","id":"<SITE_ID>"},"appInstance":{"appDefId":"<APP_DEF_ID>"}}` —
34
+ `appDefId` nests under `appInstance`. See [Install Wix Apps](../app-installation/install-wix-apps.md).
41
35
 
42
36
  ## Create the event
43
37
 
@@ -55,122 +49,150 @@ curl -X POST 'https://www.wixapis.com/events/v3/events' \
55
49
  "timeZoneId": "America/New_York"
56
50
  },
57
51
  "registration": { "initialType": "RSVP" }
58
- },
59
- "draft": true
52
+ }
60
53
  }'
61
54
  ```
62
55
 
63
- `title`, `location`, `dateAndTimeSettings` and `registration.initialType` are all required.
64
- Drop `"draft": true` to create the event already published; a draft has `status: "DRAFT"` and
65
- is invisible on the site until published with `POST /events/v3/events/{eventId}/publish`
66
- (empty body), which moves it to `UPCOMING`.
56
+ `title`, `location`, `dateAndTimeSettings` and `registration.initialType` are required. The event
57
+ is created published (`status: "UPCOMING"`).
67
58
 
68
- ## Date and time
59
+ > **Do not add `"draft": true` unless the user asked for a draft.** Draft events require the
60
+ > `WIX_EVENTS.READ_DRAFT_EVENTS` permission, and without it every follow-up call fails `403` —
61
+ > adding ticket definitions, querying the event, fetching it by slug, even publishing it. The
62
+ > event is created, but nothing can be done with it. Create it published and skip the publish
63
+ > step entirely.
69
64
 
70
- **`startDate` and `endDate` are ISO-8601 strings, not `{seconds, nanos}` objects.**
65
+ ## Date and time
71
66
 
72
- The spec types these fields as `string` / `format: date-time` but also carries a pointer to the
73
- `google.protobuf.Timestamp` message, whose fields are `seconds` and `nanos`. That message
74
- describes the *internal* representation and must not be sent — it fails with
75
- `400 {"message":"Expected a string."}`. This applies to every date-time field across the Wix
76
- APIs, not only Events.
67
+ **`startDate` and `endDate` are ISO-8601 strings, not `{seconds, nanos}` objects.** The spec types
68
+ them as `string` / `format: date-time` but also points at `google.protobuf.Timestamp`, whose
69
+ fields are `seconds` and `nanos`. That is the internal form and must not be sent. This applies to
70
+ every date-time field across the Wix APIs.
77
71
 
78
72
  | Rule | If broken |
79
73
  | --- | --- |
80
- | `startDate` / `endDate` are ISO-8601 strings | `400 Expected a string.` |
74
+ | ISO-8601 strings | `400 Expected a string.` |
81
75
  | `endDate` is required | `400 endDate.isDefined must be true, event cannot have negative duration` |
82
- | `timeZoneId` is required, in [TZ database](https://www.iana.org/time-zones) form (`America/New_York`) | `400 getTimeZoneId is not supported` |
76
+ | `timeZoneId` is required, in [TZ database](https://www.iana.org/time-zones) form | `400 getTimeZoneId is not supported` |
83
77
 
84
- > The `timeZoneId` error reads as though the field is unsupported. It is not — it means the
85
- > field is **missing**. Add `timeZoneId`; do not remove it.
78
+ > The `timeZoneId` error reads as though the field is unsupported. It is not — it means the field
79
+ > is **missing**. Add it; do not remove it.
80
+
81
+ Midnight is `00:00` of the next day. `2026-08-18T24:00:00.000Z` is not a valid ISO time.
86
82
 
87
83
  **Date to be announced:** send `dateAndTimeSettings` as
88
84
  `{ "dateAndTimeTbd": true, "dateAndTimeTbdMessage": "Date coming soon" }` and nothing else. The
89
- message is mandatory — omitting it fails with `400 getScheduleTbdMessage must not be a blank`.
85
+ message is mandatory — omitting it fails `400 getScheduleTbdMessage must not be a blank`.
90
86
 
91
87
  ## Location
92
88
 
93
- `location.type` is `VENUE` or `ONLINE`. There is no `TBD` type — a to-be-announced location is
94
- a `VENUE` with `locationTbd: true`.
89
+ `location.type` is `VENUE` or `ONLINE`. There is no `TBD` type — a to-be-announced location is a
90
+ `VENUE` with `locationTbd: true`.
95
91
 
96
92
  | Body | Result |
97
93
  | --- | --- |
98
94
  | `{ "name": "Grand Hall", "type": "VENUE" }` | Accepted |
99
- | `{ "name": "Zoom", "type": "ONLINE" }` | Accepted |
100
95
  | `{ "name": "To be announced", "locationTbd": true }` | Accepted — `type` defaults to `VENUE` |
101
- | `{ "locationTbd": true }` | `400 Event location is invalid ... Location address must not be a blank` |
102
- | `{ "name": "TBA", "type": "TBD", "locationTbd": true }` | `400 type enum must be in [VENUE(0), ONLINE(1)]` |
103
-
104
- For a real street address, add an `address` object:
96
+ | `{ "locationTbd": true }` | `400 Location address must not be a blank` |
97
+ | `{ "name": "TBA", "type": "TBD" }` | `400 type enum must be in [VENUE(0), ONLINE(1)]` |
105
98
 
106
- ```json
107
- "location": {
108
- "name": "Javits Center", "type": "VENUE",
109
- "address": {
110
- "country": "US", "subdivision": "US-NY", "city": "New York", "postalCode": "10001",
111
- "streetAddress": { "number": "429", "name": "11th Ave" }
112
- }
113
- }
114
- ```
115
-
116
- `subdivision` is the ISO-3166-2 code (`US-NY`), and the API fills in `formattedAddress` and
117
- `geocode` on the response. A `VENUE` with no `address` comes back with `locationTbd: true` set
118
- by the API whether or not you sent it.
99
+ For a street address add `address`:
100
+ `{ "country": "US", "subdivision": "US-NY", "city": "New York", "postalCode": "10001",
101
+ "streetAddress": { "number": "429", "name": "11th Ave" } }` — `subdivision` is the ISO-3166-2
102
+ code; the API fills in `formattedAddress` and `geocode`.
119
103
 
120
104
  ## Registration type and capacity
121
105
 
122
106
  `initialType` must be nested under `registration`; at the root of `event` it is treated as
123
- omitted and fails with the same error. Accepted values are **`RSVP`**, **`TICKETING`**,
124
- `EXTERNAL` and `NONE`.
125
-
126
- > The API's error text for this field advertises `[RSVP,TICKETS,RSVP_AND_TICKETS]`. Those
127
- > values do not work — `TICKETS` is rejected. Use `TICKETING`.
107
+ omitted. Accepted values are **`RSVP`**, **`TICKETING`**, `EXTERNAL` and `NONE`.
128
108
 
129
- `initialType` is immutable: an `RSVP` event can never become a `TICKETING` event or vice versa
130
- (either can later become `EXTERNAL` or `NONE` via `registration.type`). Choose correctly at
131
- creation time — "people should register by RSVP, not tickets" means `RSVP`.
109
+ > The API's error text advertises `[RSVP,TICKETS,RSVP_AND_TICKETS]`. Those do not work —
110
+ > `TICKETS` is rejected. Use `TICKETING`.
132
111
 
133
- **Guest limit.** For an RSVP event, the cap is `registration.rsvp.limit`:
112
+ `initialType` is immutable: an `RSVP` event can never become `TICKETING` or vice versa. Choose
113
+ correctly at creation — "register by RSVP, not tickets" means `RSVP`.
134
114
 
135
- ```json
136
- "registration": { "initialType": "RSVP", "rsvp": { "limit": 30 } }
137
- ```
138
-
139
- A `limit` placed directly on `registration` is **silently ignored** — the event is created with
140
- no cap and no error. Set `waitlistEnabled: true` alongside it to let guests join a waitlist once
141
- the limit is reached. For a ticketed event the cap is per ticket type, via `initialLimit` on the
142
- ticket definition — see [Manage Wix Events](manage-wix-events.md).
115
+ **Guest limit (RSVP events).** The cap is `registration.rsvp.limit`:
116
+ `"registration": { "initialType": "RSVP", "rsvp": { "limit": 30 } }`. A `limit` placed directly
117
+ on `registration` is **silently ignored** — no cap, no error. Add `waitlistEnabled: true` for a
118
+ waitlist. Ticketed events cap per tier instead, via `initialLimit` below.
143
119
 
144
120
  ## Description — two different fields
145
121
 
146
122
  | Field | Type | Use for |
147
123
  | --- | --- | --- |
148
- | `shortDescription` | plain string, max 500 | A one-line description under the event title |
124
+ | `shortDescription` | plain string, max 500 | One line under the event title |
149
125
  | `description` | Ricos rich content object | The formatted body on the event page |
150
126
 
151
- A plain sentence belongs in `shortDescription`. Sending a string to `description` fails with
152
- `400 {"message":"Expected an object"}` — it takes a Ricos `{ "nodes": [...] }` tree, as built in
153
- [Rich Content](../rich-content/author-ricos-rich-content.md):
127
+ A plain sentence belongs in `shortDescription`. A string sent to `description` fails
128
+ `400 Expected an object` — it takes a Ricos `{ "nodes": [...] }` tree, as built in
129
+ [Rich Content](../rich-content/author-ricos-rich-content.md). `shortDescription` is returned only
130
+ with `"fields": ["DETAILS"]`, `description` only with `["TEXTS"]`; both are stored regardless.
131
+
132
+ ## Ticket tiers
133
+
134
+ For events created with `"initialType": "TICKETING"`. One call per tier — there is no
135
+ bulk-create, and up to 100 tiers per event.
136
+
137
+ ```bash
138
+ curl -X POST 'https://www.wixapis.com/events/v3/ticket-definitions' \
139
+ -H 'Content-Type: application/json' -H 'Authorization: <AUTH>' \
140
+ --data-binary '{
141
+ "ticketDefinition": {
142
+ "eventId": "<EVENT_ID>",
143
+ "name": "General Admission",
144
+ "pricingMethod": { "fixedPrice": { "value": "25.00", "currency": "USD" } },
145
+ "feeType": "FEE_ADDED_AT_CHECKOUT",
146
+ "initialLimit": 100
147
+ }
148
+ }'
149
+ ```
150
+
151
+ | To create | `pricingMethod` |
152
+ | --- | --- |
153
+ | Fixed price | `{ "fixedPrice": { "value": "25.00", "currency": "USD" } }` |
154
+ | Free | `{ "fixedPrice": { "value": "0", "currency": "USD" } }` |
155
+ | Donation, with a minimum | `{ "guestPrice": { "value": "5.00", "currency": "USD" } }` |
156
+
157
+ - **`feeType` is required** — `FEE_ADDED_AT_CHECKOUT` or `FEE_INCLUDED`.
158
+ - **`value` is a string.** `"value": 10` fails `400 Unexpected value for field value`.
159
+ - **No writable `free` flag** — `pricingMethod.free` is read-only; a free ticket is a `fixedPrice`
160
+ of `"0"`.
161
+ - Quantity is **`initialLimit`**, not `initialQuantity`; omit for unlimited. `limitPerCheckout` is
162
+ read-only. `name` max 30 chars.
163
+
164
+ ## Recurring events
165
+
166
+ Wix Events has **no recurrence rule** — no `RRULE`, no "weekly" pattern. Calculate every
167
+ occurrence yourself and list them all (up to 1000). **Each occurrence needs its own
168
+ `timeZoneId`**; omitting it fails with a cryptic `ZoneOffset` error:
154
169
 
155
170
  ```json
156
- "description": { "nodes": [ { "type": "PARAGRAPH", "id": "p1", "paragraphData": {},
157
- "nodes": [ { "type": "TEXT", "id": "", "nodes": [],
158
- "textData": { "text": "Monthly meetup to discuss a new book.", "decorations": [] } } ] } ] }
171
+ "dateAndTimeSettings": {
172
+ "startDate": "2026-10-20T18:00:00.000Z",
173
+ "endDate": "2026-10-20T19:00:00.000Z",
174
+ "timeZoneId": "America/New_York",
175
+ "recurringEvents": {
176
+ "individualEventDates": [
177
+ { "startDate": "2026-10-20T18:00:00.000Z", "endDate": "2026-10-20T19:00:00.000Z", "timeZoneId": "America/New_York" },
178
+ { "startDate": "2026-10-27T18:00:00.000Z", "endDate": "2026-10-27T19:00:00.000Z", "timeZoneId": "America/New_York" }
179
+ ]
180
+ }
181
+ }
159
182
  ```
160
183
 
161
- `shortDescription` is only returned when the request asks for `"fields": ["DETAILS"]`, and
162
- `description` only with `"fields": ["TEXTS"]`. Both are stored regardless.
184
+ Pick a sensible horizon for "weekly" and say how many occurrences you created. The event returns
185
+ `recurrenceStatus: "RECURRING"`. Each occurrence is an independent event with its own ID; all
186
+ share a generated `recurringEvents.categoryId`, which is how you query the series.
163
187
 
164
188
  ## Gotchas & troubleshooting
165
189
 
166
- - **An invalid enum value reports as a missing one.** Sending a value outside an enum returns
167
- `<field> value is required` rather than "invalid value". If a field you *did* send is reported
168
- as required, suspect the value, not its presence.
169
- - **Error text names internal accessors, not request fields.** `getTimeZoneId`,
170
- `getScheduleTbdMessage` and `endDate.isDefined` each map to the plain field of the same name.
171
- - `title` is required, min 1 and max 120 characters. There is no separate name field.
190
+ - **An invalid enum value reports as a missing one** — `<field> value is required` rather than
191
+ "invalid value". If a field you *did* send is reported as required, suspect the value.
192
+ - **Error text names internal accessors**: `getTimeZoneId`, `getScheduleTbdMessage`,
193
+ `endDate.isDefined` each map to the plain field of the same name.
172
194
 
173
195
  ## Related APIs
174
196
  - **Wix Events V3**: [REST](https://dev.wix.com/docs/api-reference/business-solutions/events/event-management/events-v3)
175
- - [Manage Wix Events](manage-wix-events.md) — tickets, publish, cancel, clone, recurring, count
176
- - [Install Wix Apps](../app-installation/install-wix-apps.md) — the `428` pre-flight
197
+ - **Ticket Definitions V3**: [REST](https://dev.wix.com/docs/api-reference/business-solutions/events/event-management/ticket-definitions-v3)
198
+ - [Manage Wix Events](manage-wix-events.md) — publish, cancel, delete, clone, update, count
@@ -1,19 +1,19 @@
1
1
  ---
2
- name: "Manage Wix Events — Tickets, Publishing, Cloning and Recurring Series"
3
- description: "Manages existing events with the Wix Events V3 API — ticket definitions and pricing (fixed price, free, donation, multiple tiers), publishing a draft, cancelling, deleting, cloning, updating an event's date or details, counting events, and creating a recurring series. Use when the user wants to add or price tickets, publish or cancel an event, duplicate an event, move an event's date, count their events, or set up a repeating event."
2
+ name: "Manage Wix Events — Publishing, Cancelling, Cloning and Counting"
3
+ description: "Operates on events that already exist with the Wix Events V3 API — publishing a draft, cancelling, deleting, cloning, updating an event's date or details, and counting events. Use when the user wants to publish or cancel an event, duplicate one, move an event's date, or count their events. Creating an event, its tickets or a recurring series is a separate recipe."
4
4
  ---
5
5
 
6
- # Manage Wix Events — Tickets, Publishing, Cloning and Recurring Series
6
+ # Manage Wix Events — Publishing, Cancelling, Cloning and Counting
7
7
 
8
8
  ## Goal
9
- Operate on events that already exist: sell tickets, publish, cancel, delete, clone, update,
10
- count, and build recurring series. To create the event in the first place — including its date,
11
- location, description and guest limit — see [Create an Event](create-wix-event.md).
9
+ Operate on events that already exist. Creating an event — including its date, location,
10
+ description, guest limit, ticket tiers and recurring occurrences — is
11
+ [Create an Event](create-wix-event.md).
12
12
 
13
- ## Prerequisite — the Wix Events app must be installed
13
+ ## Prerequisite — the Wix Events app
14
14
 
15
15
  Every endpoint here returns `428 WIX_EVENTS_APP_NOT_INSTALLED` against a site without the app.
16
- Install it first — do not guess the install path, which is easy to get wrong:
16
+ Install it first — do not guess the install path:
17
17
 
18
18
  ```bash
19
19
  curl -X POST 'https://www.wixapis.com/apps-installer-service/v1/app-instance/install' \
@@ -26,50 +26,7 @@ curl -X POST 'https://www.wixapis.com/apps-installer-service/v1/app-instance/ins
26
26
  ```
27
27
 
28
28
  `appDefId` nests under `appInstance`, not at the root — at the root it fails with
29
- `400 appInstance must not be empty`. See [Install Wix Apps](../app-installation/install-wix-apps.md)
30
- for the full flow.
31
-
32
- ## Ticket definitions
33
-
34
- Ticket definitions belong to events created with `"initialType": "TICKETING"`. Tickets are a
35
- separate API; up to 100 definitions per event.
36
-
37
- ```bash
38
- curl -X POST 'https://www.wixapis.com/events/v3/ticket-definitions' \
39
- -H 'Content-Type: application/json' \
40
- -H 'Authorization: <AUTH>' \
41
- --data-binary '{
42
- "ticketDefinition": {
43
- "eventId": "<EVENT_ID>",
44
- "name": "General Admission",
45
- "pricingMethod": { "fixedPrice": { "value": "25.00", "currency": "USD" } },
46
- "feeType": "FEE_ADDED_AT_CHECKOUT",
47
- "initialLimit": 100
48
- }
49
- }'
50
- ```
51
-
52
- | To create | `pricingMethod` |
53
- | --- | --- |
54
- | A fixed-price ticket | `{ "fixedPrice": { "value": "25.00", "currency": "USD" } }` |
55
- | A free ticket | `{ "fixedPrice": { "value": "0", "currency": "USD" } }` |
56
- | A donation / pay-what-you-want ticket, with a minimum | `{ "guestPrice": { "value": "5.00", "currency": "USD" } }` |
57
-
58
- Easy to get wrong:
59
-
60
- - **`feeType` is required** — `FEE_ADDED_AT_CHECKOUT` (fee on top of the price) or
61
- `FEE_INCLUDED` (fee absorbed into it).
62
- - **`value` is a string.** `"value": 10` fails with `400 Unexpected value for field value`.
63
- - **There is no writable `free` flag.** `pricingMethod.free` is read-only, computed from the
64
- price; sending `{"free": true}` fails with `value fixedPrice or guestPrice or pricingOptions
65
- must not be empty`.
66
- - **The quantity field is `initialLimit`**, not `initialQuantity`. Omit it for unlimited tickets.
67
- - `limitPerCheckout` is read-only — it cannot be set on create.
68
- - `name` is capped at 30 characters, `description` at 500.
69
-
70
- **Multiple tiers** — call the endpoint once per tier with the same `eventId`. For "General
71
- Admission at $20 and VIP at $50", that is two calls, each with its own `name`, `fixedPrice` and
72
- `initialLimit`. There is no bulk-create for ticket definitions.
29
+ `400 appInstance must not be empty`. See [Install Wix Apps](../app-installation/install-wix-apps.md).
73
30
 
74
31
  ## Publish, cancel and delete
75
32
 
@@ -82,14 +39,20 @@ Admission at $20 and VIP at $50", that is two calls, each with its own `name`, `
82
39
  Publish and cancel take an empty body. Publishing is irreversible — a published event cannot
83
40
  return to `DRAFT`. Cancelling closes registration but keeps the event; deleting removes it.
84
41
 
42
+ > **Draft events need the `WIX_EVENTS.READ_DRAFT_EVENTS` permission.** Without it, publishing a
43
+ > draft fails `403` — as does querying it, fetching it by slug, or adding ticket definitions to
44
+ > it. If you hit that `403`, the event was still created; the way forward is to create events
45
+ > already published rather than as drafts, which needs no publish step at all. See
46
+ > [Create an Event](create-wix-event.md).
47
+
85
48
  ## Clone an event
86
49
 
87
50
  `POST /events/v3/events/{eventId}/clone` with an empty body copies the registration form,
88
51
  notifications, translations and ticket configuration.
89
52
 
90
- > **The clone does not keep the original's date.** Its start date is reset to roughly 14 days
91
- > from now, and it comes back as a `DRAFT`. If the user wanted a duplicate on a particular date,
92
- > follow the clone with an update, then publish it.
53
+ > **The clone does not keep the original's date.** Its start date is reset to roughly 14 days from
54
+ > now and it comes back as a `DRAFT`. For a duplicate on a particular date, follow the clone with
55
+ > an update — and note the draft permission above.
93
56
 
94
57
  ## Update an event
95
58
 
@@ -110,9 +73,13 @@ curl -X PATCH 'https://www.wixapis.com/events/v3/events/<EVENT_ID>' \
110
73
  }'
111
74
  ```
112
75
 
113
- The Events API takes **no field mask and no `revision`** on update — send only the fields you
114
- are changing. Send `dateAndTimeSettings` complete when moving a date: `startDate`, `endDate` and
115
- `timeZoneId` together, since the same required-field rules apply as on create.
76
+ The Events API takes **no field mask and no `revision`** on update — send only the fields you are
77
+ changing. A `revision`, if you send one, is ignored rather than rejected.
78
+
79
+ **When moving a date, send `startDate` and `endDate` together.** `dateAndTimeSettings` is replaced
80
+ wholesale rather than merged, so a patch carrying only `startDate` leaves the event with no end and
81
+ fails `400 event cannot have negative duration` — an error naming neither the missing field nor the
82
+ replacement. `timeZoneId` is optional here, unlike on create; the stored one is kept.
116
83
 
117
84
  Ticket definitions are the exception — `PATCH /events/v3/ticket-definitions/{ticketDefinition.id}`
118
85
  *does* require the current `revision`, which increments on every update.
@@ -126,49 +93,21 @@ Ticket definitions are the exception — `PATCH /events/v3/ticket-definitions/{t
126
93
  ```
127
94
 
128
95
  Query Events returns only published events — **drafts are excluded from both the results and the
129
- total**. Create with `"draft": false`, or publish first, if the count is meant to include the
130
- event you just made.
96
+ total**, and including them needs the draft permission above. Create published, or publish first,
97
+ if the count is meant to include the event you just made.
131
98
 
132
99
  `POST /events/v3/events/count-by-status` exists, but an empty request body returns empty `facets`
133
100
  even when the site has events, so it is not the way to answer "how many events do I have".
134
101
 
135
- ## Recurring events
136
-
137
- Wix Events has **no recurrence rule** — no `RRULE`, no "weekly" pattern. Calculate every
138
- occurrence date yourself and list them all (up to 1000), alongside the normal top-level
139
- `startDate` / `endDate` / `timeZoneId`:
140
-
141
- ```json
142
- "dateAndTimeSettings": {
143
- "startDate": "2026-10-20T18:00:00.000Z",
144
- "endDate": "2026-10-20T19:00:00.000Z",
145
- "timeZoneId": "America/New_York",
146
- "recurringEvents": {
147
- "individualEventDates": [
148
- { "startDate": "2026-10-20T18:00:00.000Z", "endDate": "2026-10-20T19:00:00.000Z", "timeZoneId": "America/New_York" },
149
- { "startDate": "2026-10-27T18:00:00.000Z", "endDate": "2026-10-27T19:00:00.000Z", "timeZoneId": "America/New_York" }
150
- ]
151
- }
152
- }
153
- ```
154
-
155
- For "a weekly event starting next week", generate the dates yourself — pick a sensible horizon
156
- (a few months) and say how many occurrences you created. The event returns
157
- `recurrenceStatus: "RECURRING"`. Each occurrence is an independent event with its own ID,
158
- updatable and deletable on its own; all share a generated `recurringEvents.categoryId`. Query by
159
- that `categoryId` to retrieve the whole series.
160
-
161
102
  ## Gotchas & troubleshooting
162
103
 
163
- - **An invalid enum value reports as a missing one.** A value outside an enum returns
164
- `<field> value is required` rather than "invalid value" — true for `feeType` and
165
- `registration.initialType`. If a field you *did* send is reported as required, suspect the
166
- value, not its presence.
167
- - Dates are always ISO-8601 strings, never `{seconds, nanos}` — see
168
- [Create an Event](create-wix-event.md).
104
+ - **An invalid enum value reports as a missing one** — a value outside an enum returns
105
+ `<field> value is required` rather than "invalid value". If a field you *did* send is reported
106
+ as required, suspect the value, not its presence.
107
+ - Dates are always ISO-8601 strings, never `{seconds, nanos}`, and `timeZoneId` is required
108
+ whenever `dateAndTimeSettings` is sent — see [Create an Event](create-wix-event.md).
169
109
 
170
110
  ## Related APIs
171
111
  - **Wix Events V3**: [REST](https://dev.wix.com/docs/api-reference/business-solutions/events/event-management/events-v3)
172
- - **Ticket Definitions V3**: [REST](https://dev.wix.com/docs/api-reference/business-solutions/events/event-management/ticket-definitions-v3)
173
112
  - **Event Guests**: `POST /events/v2/guests/query` — who registered
174
- - [Create an Event](create-wix-event.md) — the create body, dates, location, capacity
113
+ - [Create an Event](create-wix-event.md) — create body, dates, location, capacity, tickets, recurring