Many trigger filters, action inputs and condition fields take the id of something that already exists on the site — a form, label, service, product, coupon. This file covers how to tell which entity a field needs, how to get real ids through public APIs, how the builder shows them, and which components need special handling.
TL;DR
uiSchema (static or from the dynamic input schema): "ui:widget": "EntitySelector" +
entitySelectorOptions{selectorId | tag, filters, dynamicFiltersMapping} → entity id(s).
selectorId = <appId>_<providerName> (e.g. …_couponsPicker) names one kind; tag names a
family — ids from any provider in it are valid.itemsSelectionConfiguration{providerKey, tag} →
an entity id or key of that kind.filters[] entry: valueInput.type: "ENTITY_SELECTOR" +
entitySelector{id, multiSelect, queryFieldToFilterIdMapping, queryFieldToValueMapping} → ids as
quoted string literals in a literal array (Automations Trigger Configuration §4.1). queryFieldToFilterIdMapping
= depends on another filter; queryFieldToValueMapping = fixed constraints (e.g.
{namespace: "wix.form_app.form"}) — honor them in your lookup.No marker (common on WIDGET_COMPONENT actions): infer the entity from the field name,
title/description and the owning app — e.g. labelKeys on the Contacts add-label action →
label keys; contactId → map it from the payload, not a lookup. Can't tell → ask.
How the builder renders an action entity selector (MUST follow):
type: "string" → exactly one id ("couponId": "<uuid-1>");
never an array. type: "array" → array of ids, max 50; with no selection, omit the key
(the picker writes nothing, not []). Trigger filters use a literal array of quoted ids even for one value
(Automations Trigger Configuration §4.1–4.2); conditions compare with stringContains(["<id>"];var("field")) (Automations Conditions).item.id === value exactly. Use the identifier the entity's API returns, unchanged — not
always a uuid (contact labels use a key such as custom.vip). Never reformat or lower-case it.dynamicFiltersMapping = {"<filterKey>": {"pathToValue": "<field in this mapping>"}}: the
options are filtered by another field of the same mapping (stage ← pipeline, step ← program,
ticket ← event). MUST set that parent field in the same mapping, and the child id MUST belong to
that parent — the picker queries with the parent as filter, so a child from another parent shows
"Item not found". With the parent empty the picker is disabled; when the user changes the parent,
the child is cleared.entitySelectorOptions.filters restrict the options too; apply the same restriction in
your own lookup._, field title, owning app).{id, name}, but Contacts Labels return {key, displayName}.{entityKind, value, valueField, displayName, source} so you can show the user what you
selected. For Contacts Labels, valueField is key; keep that exact key for labelKeys rather
than discarding it, guessing an id, or using displayName as the saved value.Use the following lookups with the site's authorized vertical scope. Each row is a complete first-page POST: use the full endpoint shown with its JSON body, then read the response collection. Names below are placeholders for the user's requested name. Match exactly, retain all matches, and ask if more than one candidate remains. Apply the selector's additional fixed and parent filters; a name match alone does not establish provider compatibility.
| Entity / provider | POST endpoint | Minimal first-page body | Response values and official contract |
|---|---|---|---|
Wix Forms app (formAppSelectionProvider, formApp) | https://www.wixapis.com/form-schema-service/v4/forms/query | {"namespace":"wix.form_app.form","query":{"cursorPaging":{"limit":50}}} | forms[]: select id, display name; field definitions are formFields. Query Forms, View Forms permission. |
Contact labels (LabelsItemsSelection, labels) | https://www.wixapis.com/contacts/v4/labels/query | {"query":{"filter":{"displayName":{"$eq":"<label name>"}},"paging":{"limit":50,"offset":0}}} | labels[]: select key, display displayName. Query Labels, Manage Contact Labels permission. This lookup workflow does not authorize creating a label. |
Bookings services (bookingsServices) | https://www.wixapis.com/bookings/v2/services/query | {"query":{"filter":{"name":{"$eq":"<service name>"}},"paging":{"limit":50,"offset":0}}} | services[]: select id, display name. Query Services, Read Bookings – Public Data permission. |
Events (eventId) | https://www.wixapis.com/events/v3/events/query | {"query":{"filter":{"title":{"$eq":"<event title>"}},"paging":{"limit":50,"offset":0}}} | events[]: select id, display title. Query Events, Read Events permission. Set a positive limit: the default 0 returns no events. Drafts require separate permission and includeDrafts:true; without that scope, do not conclude the site has no matching draft. |
Business locations (LocationsProvider) | https://www.wixapis.com/locations/v1/locations/query | {"query":{"filter":{"name":{"$eq":"<location name>"}},"paging":{"limit":50,"offset":0}}} | locations[]: select id, display name. Query Locations, Read Locations permission. |
Pagination is part of resolving ambiguity or absence.
metadata.hasNext is true, send
{"query":{"cursorPaging":{"cursor":"<metadata.cursors.next>"}}} to the same endpoint,
without repeating first-page filters/sort.query.paging.offset by pagingMetadata.count,
preserving the filter and limit. For Locations, continue only while pagingMetadata.hasNext
is true. For Labels, Bookings and Events, use pagingMetadata.total when available and
reliable (tooManyToCount is not true); otherwise continue until a short/empty page establishes
the end. An unknown total and a full page require another page.id or
label key, shaped as the selector's string/array schema requires.Follow the update scope in Automations Validation and Persistence: re-verify the entities and fields the requested update touches. A recipient-only edit does not require resolving IDs in an unchanged add-label step. Read-only status inspection and status-only deactivation do not require entity lookups; follow the Activation Status guide for those operations.
var("contactId") and opaque provider content identifiers
such as email message IDs are not static entity selections; preserve those through their owning
workflow without inventing entity lookups.An unresolved selection blocks the write. A request to keep existing labels or selections
does not authorize saving a reference that the fresh lookup cannot verify. Stop even when
Validate Automation returns VALID_WITH_WARNINGS or a provider warning says the configuration
can be saved as-is: validation severity does not establish entity existence or override this
precondition. Explain which selection is unresolved and ask the user whether to choose a valid
replacement, remove it, or leave the automation unchanged. Wait for their choice before any
configuration write; do not recreate an entity, silently remove its key, or claim the update
was saved. For example: “The selected label <key> could not be verified. Should I replace it
with an existing label, remove that selection, or leave this automation unchanged?”
Changed-label-field verification example.
When editing a Contacts add-label action's static labelKeys array, read kept keys from the
freshly fetched action and resolve any new selections. Verify every key in that edited array;
an untouched add-label step needs no fresh lookup. Query Labels
supports key.$in: POST https://www.wixapis.com/contacts/v4/labels/query with the actual
keys intended for that edited field (at most 50 per batch), under the same authorized site context:
Compare keys, not names. A deleted/recreated label can have the same name and a different key; a renamed label can retain the same valid key. This pure function builds compact evidence from the candidate node's complete edited array and the fresh Query Labels response body. Build the candidate from the fetched node, keeping requested selections and adding only verified new keys; do not include removed selections in this check:
Return these per-selection records from the lookup, including the actual selectedKey and
returnedKey; a successful call or an unchanged mapping alone is not existence proof.
Proceed only after every selection in the changed field is positively verified. A false record is unresolved,
not proof of deletion: finish applicable paging before claiming absence, and stop/ask when a
lookup is failed, incomplete or still unresolved. Preserve every unedited mapping field.
Runtime expressions and opaque provider identifiers remain outside this static-label example.
For legacy forms, contact segments, pricing plans, products, coupons, event ticket definitions,
reservation locations, online programs/steps, pipelines/stages, badges, groups, loyalty tiers,
CMS collections and other app pickers, verify the owning vertical's official public read
method and confirm that its returned selectable ID/key matches this provider and all
parent/fixed filters before using it. No endpoint or ID shape for these kinds is assumed here.
Without that evidence, ask the user for an existing entity and a verifiable reference;
do not fabricate a URL or slug.
For fixed-value lists the field's schema enum is authoritative.
With near-duplicate triggers (two "form submitted"), the family whose entities you can actually find on the site is the live one.
Components needing handling beyond "map the input schema". Match by appId + key from Resolve.
Send an email — initialize each new triggered-emails action with Generate Action Input
Mapping, whether creating an automation or adding a step during Update; persist before content
edits. Existing email content edits use Get / Set Email Content without initialization.
See Automations Email Actions for the public endpoint, settings, sequence and recipient verification.
CUSTOM email recipients — resolve recipient-provider IDs through Automations Email Actions §4, using its site-scoped audience-provider discovery and schema-defined parameters, rather than an entity-selector lookup. For a recipient-only Update Automation Email Action PATCH, verify the new audience selections through that procedure and preserve unrelated saved steps and fields; do not re-resolve an untouched add-label step's IDs.
Preservation evidence is separate from entity lookups. Retain the complete successful pre-PATCH Automation Get and the complete fresh post-PATCH Get, alongside typed settings/content snapshots and the PATCH acknowledgement. Return both complete Automation objects, or preferably a compact executed comparison covering all preserved fields when the snapshots are large (Automations Email Actions §4). A creation-candidate comparison establishes only the fields it actually compares; it does not establish preservation after the recipient PATCH.
139ef4fa-c108-8f9a-c7be-d5f492a2c939 / wix_automations-webhook_trigger:
generate a fresh uuid webhook id, set it per Automations Trigger Configuration / Automations Schemas and Scheduling, define
trigger.overrideSchema with the posted fields (keep webhookId); give the user the URL
(Automations Trigger Configuration §6) — the builder shows the same one.wix_automations-custom_trigger: define overrideSchema; the automation runs only
when the user's site code calls Run Trigger (hookId, snippet and REST call: Automations Trigger Configuration §6).wix_automations-scheduled_trigger: timing in automationConfigMapping;
site IANA time zone from current tool metadata for the exact site, with Site Properties as fallback; if neither supplies a valid zone, ask (Automations Schemas and Scheduling §4).webhooks-action, "HTTP request") — collect URL, method and body fields from the
user up front. Its input schema has no header/auth input: if the endpoint needs auth, it can go
in the URL only if the receiving service supports that (e.g. a token query parameter) — otherwise
tell the user it can't be configured here. appDefinedInfo.overrideOutputSchema only if a later
step reads the response.
Body items marked _UIRequired must be mapped, even if absent from JSON Schema required.wix_automations-llm_call) / Custom AI agent
(ai_custom_agent_bm-delegate_to_agent) — overrideOutputSchema when a later step consumes the
result, per the per-action rules in Automations Schemas and Scheduling §3 (enum decision fields,
concrete {{var(…)}} inputs in the prompt, agent schema matches its task). Delegate-to-assistant
exposes only summary.PROVIDER_ERROR from Validate until the user connects the account.Override output schemas are allowed only on the webhook and custom triggers and the webhook, LLM and custom-agent actions (Automations Schemas and Scheduling).
New email initialization, existing content edits, recipient encoding and provider settings updates are documented in Automations Email Actions. Use that reference before configuring any email step; do not hand-author or reuse an email's opaque mapping.
Last updated: 12 November 2026