@wix/agent-skills 1.32.0 → 1.33.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 (30) hide show
  1. package/README.md +21 -0
  2. package/package.json +2 -2
  3. package/skills/wix-app/references/DASHBOARD_PAGE.md +1 -1
  4. package/skills/wix-app/references/EDITOR_REACT_COMPONENT.md +40 -41
  5. package/skills/wix-app/references/editor-react-component/ANIMATED-COMPONENTS.md +11 -6
  6. package/skills/wix-app/references/editor-react-component/DESIGN-STATES.md +2 -3
  7. package/skills/wix-app/references/editor-react-component/DISABLED-INVALID.md +31 -0
  8. package/skills/wix-app/references/editor-react-component/MANIFEST-ERRORS.md +14 -1
  9. package/skills/wix-app/references/editor-react-component/PARTS.md +32 -3
  10. package/skills/wix-app/references/editor-react-component/SSR.md +6 -3
  11. package/skills/wix-headless-kit/install/pins.json +1 -1
  12. package/skills/wix-manage/SKILL.md +25 -7
  13. package/skills/wix-manage/references/automations/actions.md +11 -11
  14. package/skills/wix-manage/references/automations/activation-status.md +6 -9
  15. package/skills/wix-manage/references/automations/api-catalog.md +48 -32
  16. package/skills/wix-manage/references/automations/automation-model.md +97 -22
  17. package/skills/wix-manage/references/automations/bracket-expressions.md +7 -7
  18. package/skills/wix-manage/references/automations/build-and-manage-automations.md +140 -309
  19. package/skills/wix-manage/references/automations/conditions.md +187 -0
  20. package/skills/wix-manage/references/automations/schemas-and-scheduling.md +191 -0
  21. package/skills/wix-manage/references/automations/special-actions.md +210 -0
  22. package/skills/wix-manage/references/automations/triggers.md +47 -10
  23. package/skills/wix-manage/references/automations/validation-and-verification.md +320 -0
  24. package/skills/wix-manage/references/custom-apps/use-app-tools.md +124 -0
  25. package/skills/wix-manage/references/events/create-wix-event.md +136 -73
  26. package/skills/wix-manage/references/events/manage-event-guests.md +366 -0
  27. package/skills/wix-manage/references/events/manage-event-tickets.md +293 -0
  28. package/skills/wix-manage/references/events/manage-wix-events.md +313 -55
  29. package/skills/wix-manage/references/stores/update-product-with-options.md +58 -2
  30. package/skills/wix-manage/references/custom-apps/use-app-skills-and-app-tools.md +0 -208
@@ -0,0 +1,293 @@
1
+ ---
2
+ name: "Manage Event Tickets"
3
+ description: "Manages the ticket types of a ticketed Wix event with the Ticket Definitions V3 API — adding, editing, repricing, hiding, reordering and deleting tickets, scheduling or ending ticket sales, and changing the ticket currency. Use when the user wants to add early-bird, VIP, child or donation tickets to an existing event, change a ticket's price or quantity, or set when tickets stop selling."
4
+ ---
5
+
6
+ # Manage Event Tickets
7
+
8
+ ## Goal
9
+ Manage the ticket types ("ticket definitions") of a ticketed event. A ticket definition is one
10
+ type of ticket — "General Admission", "VIP" — with its price, quantity and sale period. Individual
11
+ tickets that guests bought are orders and tickets, in [Manage Event Guests](https://dev.wix.com/docs/api-reference/business-solutions/events/skills/manage-event-guests).
12
+
13
+ **Not here:**
14
+ - Creating a new event together with its first tickets: [Create an Event](https://dev.wix.com/docs/api-reference/business-solutions/events/skills/create-event#ticket-tiers).
15
+ - Closing or pausing registration for the whole event: an event setting, `PATCH https://www.wixapis.com/events/v3/events/<EVENT_ID>` with
16
+ `{ "event": { "registration": { "registrationPaused": true } } }` ([Manage Wix Events](https://dev.wix.com/docs/api-reference/business-solutions/events/skills/manage-events)).
17
+ Do not close an event's registration by ending every ticket's sale period.
18
+ - Tickets per order, tax and reservation hold: also event settings, under
19
+ `event.registration.tickets` (`ticketLimitPerOrder`, `taxSettings`, `reservationDurationInMinutes`)
20
+ with the same `PATCH https://www.wixapis.com/events/v3/events/<EVENT_ID>`.
21
+
22
+ ## Prerequisite — the Wix Events app
23
+
24
+ Every call here returns `428 WIX_EVENTS_APP_NOT_INSTALLED` on a site without the Wix Events app.
25
+ Install it with appDefId `140603ad-af8d-84a5-2c80-a0f60cb47351`:
26
+ `POST https://www.wixapis.com/apps-installer-service/v1/app-instance/install` with
27
+ `{"tenant":{"tenantType":"SITE","id":"<SITE_ID>"},"appInstance":{"appDefId":"140603ad-af8d-84a5-2c80-a0f60cb47351"}}` —
28
+ `appDefId` nests under `appInstance`. See [Install Wix Apps](https://dev.wix.com/docs/api-reference/business-management/app-installation/skills/install-wix-apps).
29
+
30
+ ## Before you start
31
+
32
+ Tickets exist only on events created with `registration.initialType: "TICKETING"`. On an RSVP event
33
+ every call here fails `428 INVALID_EVENT_TYPE`, and the event can't be converted. Find the event and
34
+ check its type first — this exact body:
35
+
36
+ ```bash
37
+ curl -X POST 'https://www.wixapis.com/events/v3/events/query' \
38
+ -H 'Content-Type: application/json' \
39
+ -H 'Authorization: <AUTH>' \
40
+ --data-binary '{
41
+ "query": {
42
+ "filter": { "title": { "$eq": "<EVENT_TITLE>" } },
43
+ "paging": { "limit": 100 }
44
+ },
45
+ "fields": ["REGISTRATION"]
46
+ }'
47
+ ```
48
+
49
+ - `paging` is a sibling of `filter` inside `query`; nested inside `filter` it fails `400`.
50
+ - Send it as is: no extra filter fields and no `sort` — a nested `registration` filter or a `sort`
51
+ inside `filter` fails `400`. Read the type and dates from the result instead.
52
+ - Don't send `includeDrafts` — `true` needs a draft-events permission and fails `403`.
53
+ - The id is `events[].id`, the type `events[].registration.initialType`. If several events match,
54
+ pick by date or ask ([Manage Wix Events](https://dev.wix.com/docs/api-reference/business-solutions/events/skills/manage-events#find-an-event)).
55
+
56
+ If it is RSVP, create nothing in this turn: tell the user an RSVP event can't be converted, that a
57
+ ticketed copy would be a new event and its RSVPs would not carry over, and ask whether to create
58
+ it — and with which tickets and prices. See [Manage Wix Events](https://dev.wix.com/docs/api-reference/business-solutions/events/skills/manage-events).
59
+
60
+ Reference pages for these calls — use them rather than searching:
61
+ [Query Ticket Definitions](https://dev.wix.com/docs/api-reference/business-solutions/events/event-management/ticket-definitions-v3/query-ticket-definitions),
62
+ [Create Ticket Definition](https://dev.wix.com/docs/api-reference/business-solutions/events/event-management/ticket-definitions-v3/create-ticket-definition),
63
+ [Update Ticket Definition](https://dev.wix.com/docs/api-reference/business-solutions/events/event-management/ticket-definitions-v3/update-ticket-definition); to
64
+ find the event, [Query Events](https://dev.wix.com/docs/api-reference/business-solutions/events/event-management/events-v3/query-events).
65
+
66
+ The examples use `https://www.wixapis.com/events/v3/ticket-definitions`. The reference's
67
+ `https://www.wixapis.com/events-ticket-definitions/v3/ticket-definitions` is the same API — either
68
+ base works.
69
+
70
+ ## List an event's tickets
71
+
72
+ ```bash
73
+ curl -X POST 'https://www.wixapis.com/events/v3/ticket-definitions/query' \
74
+ -H 'Content-Type: application/json' \
75
+ -H 'Authorization: <AUTH>' \
76
+ --data-binary '{
77
+ "query": {
78
+ "filter": { "eventId": { "$eq": "<EVENT_ID>" } },
79
+ "cursorPaging": { "limit": 100 }
80
+ },
81
+ "fields": ["SALES_DETAILS"]
82
+ }'
83
+ ```
84
+
85
+ Always filter by `eventId` — without it the query returns every event's tickets. The response is
86
+ `ticketDefinitions[]`, with paging under `metadata` (not `pagingMetadata`). Each definition carries:
87
+ - `id` and `revision` — both needed to update it;
88
+ - `name`, `pricingMethod`, `feeType`, `hidden`, `initialLimit`, `salePeriod`;
89
+ - `saleStatus` — `SALE_SCHEDULED` (not on sale yet), `SALE_STARTED` or `SALE_ENDED`;
90
+ - with `SALES_DETAILS`: `salesDetails.soldCount`, `unsoldCount` (null when unlimited),
91
+ `reservedCount`, `soldOut`.
92
+
93
+ Other filters: `name`, `hidden`, `saleStatus`, `pricingMethod.free`, `feeType` (`$eq`, `$in`, …).
94
+ To find a ticket by the name the user gave, filter `eventId` and `name` together.
95
+
96
+ ## Add a ticket type
97
+
98
+ `POST https://www.wixapis.com/events/v3/ticket-definitions`, one call per ticket type, up to 100 per
99
+ event. Create them one after another, not in parallel; on `429`, wait and retry that call before
100
+ moving to the next, and count the successes before reporting. Then list the event's tickets once
101
+ ([List an event's tickets](#list-an-events-tickets)) and report what is stored.
102
+
103
+ ```bash
104
+ curl -X POST 'https://www.wixapis.com/events/v3/ticket-definitions' \
105
+ -H 'Content-Type: application/json' \
106
+ -H 'Authorization: <AUTH>' \
107
+ --data-binary '{
108
+ "ticketDefinition": {
109
+ "eventId": "<EVENT_ID>",
110
+ "name": "Student",
111
+ "pricingMethod": { "fixedPrice": { "value": "12.00", "currency": "USD" } },
112
+ "feeType": "FEE_ADDED_AT_CHECKOUT",
113
+ "initialLimit": 30,
114
+ "salePeriod": { "endDate": "2026-11-15T05:00:00Z", "displayNotOnSale": true }
115
+ }
116
+ }'
117
+ ```
118
+
119
+ `salePeriod` dates are instants: "stop selling on November 15" for a New York event is the start
120
+ of that day in `America/New_York` — `2026-11-15T05:00:00Z` — not `T00:00:00Z`, which is 7pm the
121
+ evening before. Convert
122
+ from the event's `dateAndTimeSettings.timeZoneId`, and say the local date and time you set.
123
+ Before sending, check the instant: converted back to the event's time zone it must read 00:00 on
124
+ the requested date. If it doesn't, fix it before the create — not with a follow-up update.
125
+
126
+ A sale date the user gives without a year is the **next such date from today** — on 20 October
127
+ 2026, "stop selling on December 1st" is 1 December 2026. A sale period can never end after the
128
+ event starts: check `salePeriod.endDate` against the event's `dateAndTimeSettings.startDate`
129
+ before sending, and ask if that date falls after the event starts.
130
+
131
+ **Currency:** use the one the user names, as given ("20 euros" is `EUR`) — a ticket in that
132
+ currency is accepted even when the event has no tickets yet. When the user names none, use the
133
+ event's existing currency (`pricingMethod.fixedPrice.currency` of its other tickets, or
134
+ `registration.tickets.currency` on the event). To move an event that already has tickets to
135
+ another currency, see [Change the currency](#change-the-currency). The response is `{ "ticketDefinition": { "id",
136
+ "revision": "1", "saleStatus", ... } }`.
137
+
138
+ | Ticket | `pricingMethod` | `feeType` |
139
+ | --- | --- | --- |
140
+ | Fixed price | `{ "fixedPrice": { "value": "25.00", "currency": "USD" } }` | `FEE_ADDED_AT_CHECKOUT` |
141
+ | Free | `{ "fixedPrice": { "value": "0", "currency": "USD" } }` | `NO_FEE` |
142
+ | Donation / pay what you want (minimum may be `"0"`) | `{ "guestPrice": { "value": "5.00", "currency": "USD" } }` | `FEE_ADDED_AT_CHECKOUT` |
143
+ | Several prices in one ticket | `{ "pricingOptions": { "optionDetails": [ { "optionId": "<NEW_GUID>", "name": "Adult", "price": { "value": "30.00", "currency": "USD" } }, { "optionId": "<NEW_GUID>", "name": "Child", "price": { "value": "15.00", "currency": "USD" } } ] } }` | `FEE_ADDED_AT_CHECKOUT` |
144
+
145
+ - **Service fee.** Free ticket: `NO_FEE`. Paid ticket: `FEE_ADDED_AT_CHECKOUT` (the guest pays the
146
+ fee on top), or `FEE_INCLUDED` when the user wants to absorb the fee. On `400 INVALID_FEE_TYPE`,
147
+ read the error's `description`: `feeRequired=false` means the site collects no ticket fees — retry
148
+ that ticket once with `NO_FEE`; `feeRequired=true` means `NO_FEE` was sent on a paid ticket —
149
+ retry once with `FEE_ADDED_AT_CHECKOUT`.
150
+ - **Several prices need an `optionId` on every option** — a GUID you generate. Without it the create
151
+ fails with a bare `500 Internal Server Error`. Keep the ids from the response: an update must send
152
+ them back.
153
+ - **`value` is a string** — `"value": 10` fails `400 Unexpected value for field value`.
154
+ - **Quantity is `initialLimit`**; omit it for unlimited. If the event has a seating map, the seats
155
+ set the quantity and `initialLimit` is ignored.
156
+ - `name` is 1–30 characters, `description` up to 500, `policyText` up to 1000; a price option
157
+ `name` up to 200 and up to 100 options.
158
+ - **Read-only, never send:** `pricingMethod.free`, `pricingMethod.pricingType`, `saleStatus`,
159
+ `limited`, `actualLimit`, `limitPerCheckout`, `salesDetails`. They are ignored without an error, so
160
+ a "free" flag or a per-checkout limit you send silently does nothing. The number of tickets one
161
+ buyer can take per order is the event's `registration.tickets.ticketLimitPerOrder`.
162
+ - `428 INVALID_SALE_PERIOD` — `salePeriod.startDate` is not before `endDate` (on create and update).
163
+
164
+ ## Change a ticket
165
+
166
+ `PATCH https://www.wixapis.com/events/v3/ticket-definitions/{ticketDefinition.id}`. The current
167
+ `revision` is required (`400 revision must not be empty` without it). Read the ticket right before
168
+ updating and send its `id`, current `revision`, and the fields you are changing.
169
+
170
+ **Price changes need `"mask": "pricingMethod"`.** The ticket update takes its field mask under the
171
+ key `mask` (not `fieldmask`); send it even though the reference schema omits it. Without it:
172
+ - a `fixedPrice` change returns `200` and bumps the `revision`, but the price is **not** changed;
173
+ - a `pricingOptions` change fails `400 INVALID_PATCH … field path is illegal`.
174
+
175
+ A narrower path such as `pricingMethod.fixedPrice.value` doesn't work either. Name, description,
176
+ policy, `initialLimit`, `hidden` and `salePeriod` apply without a mask.
177
+ Example — change a price:
178
+
179
+ ```bash
180
+ curl -X PATCH 'https://www.wixapis.com/events/v3/ticket-definitions/<TICKET_DEFINITION_ID>' \
181
+ -H 'Content-Type: application/json' \
182
+ -H 'Authorization: <AUTH>' \
183
+ --data-binary '{
184
+ "ticketDefinition": {
185
+ "id": "<TICKET_DEFINITION_ID>",
186
+ "revision": "<REVISION>",
187
+ "pricingMethod": { "fixedPrice": { "value": "57.00", "currency": "USD" } }
188
+ },
189
+ "mask": "pricingMethod"
190
+ }'
191
+ ```
192
+
193
+ - **Change the price**: send the whole `pricingMethod` for the ticket's pricing kind, with
194
+ `"mask": "pricingMethod"`. To change one price option of a several-prices ticket, send the full
195
+ `pricingOptions.optionDetails` array — every option, each with its existing `optionId`, and the new
196
+ price on the one that changes — with the same mask.
197
+ - **Rename / describe**: `name`, `description`, `policyText`.
198
+ - **Quantity**: `initialLimit` — not below the number already sold.
199
+ - **Then check the response.** The returned `ticketDefinition` must show the new value as well as a
200
+ `revision` one higher — a higher `revision` alone proves nothing. If the value did not change, do
201
+ not report success: read the ticket again and tell the user what is stored.
202
+
203
+ ## Hide or show a ticket
204
+
205
+ `PATCH` as above with `"hidden": true` to hide a ticket from the event page so it can't be bought,
206
+ or `"hidden": false` to show it again. A hidden ticket can still be given to guests from the
207
+ dashboard; there is no private link or code that unlocks a hidden ticket for chosen buyers — say
208
+ so if the user asks for one.
209
+
210
+ ## Sale period — schedule, end or reopen sales
211
+
212
+ `salePeriod` controls when one ticket can be bought:
213
+
214
+ | The user wants | `salePeriod` |
215
+ | --- | --- |
216
+ | Tickets go on sale later | `{ "startDate": "<ISO>" }` |
217
+ | Stop selling this ticket on a date (early bird) | `{ "endDate": "<ISO>" }` |
218
+ | Show the ticket while it's not on sale | add `"displayNotOnSale": true` |
219
+ | Stop selling this ticket now | `{ "endDate": "<now, ISO>" }` |
220
+ | Reopen an ended ticket | `{ "endDate": "<a future ISO date>" }` — `saleStatus` goes from `SALE_ENDED` back to `SALE_STARTED` |
221
+
222
+ Dates are ISO-8601 strings, rounded down to the minute. After the change, read `saleStatus` in the
223
+ response: `SALE_STARTED` means it is buyable now. If a reopened ticket still reads `SALE_ENDED`,
224
+ also check the event: a past event, a cancelled event, or `registration.registrationPaused: true`
225
+ stops all sales regardless of the ticket's sale period — reopen registration with `PATCH https://www.wixapis.com/events/v3/events/<EVENT_ID>` and
226
+ `{ "event": { "registration": { "registrationPaused": false } } }`.
227
+
228
+ Ending sales for **every** ticket is not how to close an event's registration — pause
229
+ registration on the event instead.
230
+
231
+ ## Reorder tickets
232
+
233
+ `POST https://www.wixapis.com/events/v3/ticket-definitions/reorder`, moving one ticket before or
234
+ after another; this sets the order on the event page and in the dashboard:
235
+
236
+ ```json
237
+ {
238
+ "eventId": "<EVENT_ID>",
239
+ "ticketDefinitionId": "<TICKET_TO_MOVE>",
240
+ "beforeDefinitionId": "<TICKET_IT_GOES_BEFORE>"
241
+ }
242
+ ```
243
+
244
+ Send exactly one of `beforeDefinitionId` or `afterDefinitionId` (neither fails
245
+ `400 INVALID_REORDER_INSTRUCTION`). For a full new order, move the tickets one at a time from
246
+ second to last, each with `afterDefinitionId` set to the ticket that should precede it. The call
247
+ returns `{}`. The list call sorts by creation date by default, not by this order, so don't use it
248
+ to check the result — report the order you applied and whether every reorder call returned 2xx.
249
+
250
+ ## Delete tickets
251
+
252
+ - One: `DELETE https://www.wixapis.com/events/v3/ticket-definitions/{ticketDefinitionId}`.
253
+ - All tickets of an event, or a filtered set: `POST https://www.wixapis.com/events/v3/bulk/ticket-definitions/delete`
254
+ with a **single-level** filter — `{ "filter": { "eventId": "<EVENT_ID>" } }`. Unlike the Events
255
+ bulk calls, there is no inner `filter`. Always include `eventId`, or the call reaches other
256
+ events' tickets. It returns `{}`, and a read right afterwards can still list the tickets — wait a
257
+ few seconds and query again before reporting what was deleted.
258
+
259
+ Deleting a ticket that has sales is allowed — nothing stops it. Before deleting one
260
+ (`salesDetails.soldCount` above 0), tell the user how many were sold and confirm; hiding it is
261
+ usually what they want. Fetching a deleted ticket afterwards returns `404`.
262
+
263
+ ## Change the currency
264
+
265
+ `POST https://www.wixapis.com/events/v3/ticket-definitions/currency` with
266
+ `{ "eventId": "<EVENT_ID>", "currency": "EUR" }` changes the currency of **all** the event's tickets.
267
+ Amounts are not converted — 10 USD becomes 10 EUR — so update prices afterwards if the user wants
268
+ converted prices. Before calling, read the event with `"fields": ["DASHBOARD"]`: when
269
+ `summaries.tickets.currencyLocked` is `true` the call fails `428 CURRENCY_LOCKED` — tell the user
270
+ the currency can no longer be changed. Decide from that flag, not from whether the event has orders.
271
+
272
+ ## Count tickets
273
+
274
+ `POST https://www.wixapis.com/events/v3/ticket-definitions/count` with
275
+ `{ "filter": { "eventId": "<EVENT_ID>" }, "facet": ["saleStatus"] }` returns counts per sale status,
276
+ as `facets.saleStatus.counts` (for example `{ "SALE_STARTED": 2 }`).
277
+ For sold and remaining tickets, use the list call with `SALES_DETAILS` and sum `soldCount` and
278
+ `unsoldCount`.
279
+
280
+ ## Not supported
281
+
282
+ Say so plainly rather than approximating:
283
+ - a private link or code that unlocks a hidden ticket;
284
+ - a per-person or per-email cap across separate orders (only the per-order limit exists);
285
+ - a waitlist for a sold-out ticketed event (waitlists are RSVP-only);
286
+ - moving a sold ticket to another event or occurrence;
287
+ - one ticket admitting several people — create a ticket type per group size, or collect names on
288
+ the event's registration form ([Events Form API](https://dev.wix.com/docs/api-reference/business-solutions/events/event-management/form)).
289
+
290
+ ## Related APIs
291
+ - **Ticket Definitions V3**: [REST](https://dev.wix.com/docs/api-reference/business-solutions/events/event-management/ticket-definitions-v3) — [Update Ticket Definition](https://dev.wix.com/docs/api-reference/business-solutions/events/event-management/ticket-definitions-v3/update-ticket-definition)
292
+ - [Manage Wix Events](https://dev.wix.com/docs/api-reference/business-solutions/events/skills/manage-events) — registration settings, tickets per order, tax
293
+ - [Manage Event Guests](https://dev.wix.com/docs/api-reference/business-solutions/events/skills/manage-event-guests) — orders, sold tickets, check-in