Skip to main content
Custom fields are the extra label/value rows users add to a schedule item, venue, or stay — door codes, wifi passwords, promoter notes, and so on. The three resources have near-identical shapes, differing only in the ID they take and whether they support premade templates.

Two ways to write them

If you are already creating or updating the parent record, just include a customFields array in that request — it is simpler and costs one call. Use the dedicated endpoints below when you want to change fields without rewriting the record.
Inline (on POST/PUT of the item, venue, or stay) is a full replace — the array you send becomes the complete set, and no operation is used:
Dedicated (below) reconciles per field, so you can add one without resending the others.

Read custom fields

Scope: schedule.read / venues.read / accommodation.read Response data — array of fields:
Schedule item fields have no template_key. Custom fields are also embedded in the records themselves — customFields on GET /v1/accommodation/{id} and on schedule items, venueCustomFields on GET /v1/venues/{id}.

Add, update, or remove fields

Scope: schedule.write / venues.write / accommodation.write Body Each entry:
Only the fields you list are touched. Omitting an existing field leaves it alone — this is not a full replace, unlike the inline form.
Example — add one field and delete another in a single call:
Response data: none.

Premade fields (templates)

Venues and stays have a catalogue of premade fields. Pass templateKey instead of title and the server supplies the label:
Read the available keys from GET /v1/reference/venue-field-templates and GET /v1/reference/stay-field-templates. Omit templateKey for a free-form field — then title is required.
On stays, the premade confirmation_number field is column-backed: writing it updates the stay’s booking_number and creates no custom-field row. It will not appear in the custom-fields list, and its id comes back null.

See also: Schedule, Venues, Accommodation, Reference Data.