Event Connectors

TRCItem

The polymorphic core object that becomes an Event, Location, Venue, or Route depending on entitytype

TRCItem is the core data object in the Event Connectors API. Every event, location, venue, and route you read or write through the API is a TRCItem — differentiated by its entitytype field.

When you call GET /events, GET /locations, GET /venues, or GET /routes, you get TRCItems back. The shape is largely the same across entity types, with a few fields that only populate for certain types.

Shared Fields

Every TRCItem carries these fields regardless of entity type:

FieldTypeDescription
idstringInternal UUID
trcidstringStable identifier across systems
slugstringURL-friendly name
entitytypestringOne of EVENEMENT, LOCATIE, EVENTGROUP, ROUTE, VENUE
wfstatusstringWorkflow status — see Workflow Status below
trcItemDetailsarrayTitle, descriptions per language (see Translations)
trcItemCategoriesobjectTypes, categories, and data-typed values
calendarobjectScheduling information (see Calendar)
contactinfoobjectContact details and URLs
filesarrayAttached media (images, PDFs, videos)
locationobjectGeographical location with address and coordinates
translationsobjectprimaryLanguage and availableLanguages
seoMetadataobjectSEO fields including Open Graph and schema.org
priceElementsarrayPricing per target audience (Events only)
promotionsarrayPromotional offers with validity rules (Events only)
performersarrayPerformer list (Events only)

Workflow Status

wfstatus is the single source of truth for a TRCItem's lifecycle. The legacy boolean fields (published, deleted, offline) are derived from wfstatus automatically — never read those directly, and never write them without also updating wfstatus.

The wfstatus enum

ValueMeaning
draftBeing phased out — see note below
readyforvalidationSubmitted (e.g. via a feed) and waiting for an editor to review. Not visible to consumers.
approvedReviewed by an editor; visible to consumers. The only status that produces a published item.
rejectedReviewed and explicitly rejected. Not visible to consumers.
deletedSoft-deleted. Hidden from normal queries but still in the store.
archivedArchived (e.g. past event kept for reference). Not visible to consumers.

draft is being phased out

Saving a TRCItem with wfstatus: draft (or with no wfstatus at all) is normalised on the server to readyforvalidation. Don't write draft in new integrations — it has no separate downstream behavior.

Derivation of the legacy boolean fields

Whenever a TRCItem is saved, the server runs StatusUtil.updateFlagfieldsByWfStatus to keep the boolean fields in sync with wfstatus. Only approved produces a published / non-deleted / online item; every other status produces the same "not visible" combination.

wfstatuspublisheddeletedoffline
approvedtruefalsefalse
readyforvalidationfalsetruetrue
rejectedfalsetruetrue
archivedfalsetruetrue
deletedfalsetruetrue
draft(normalised to readyforvalidation on save)

A few consequences worth flagging:

  • deleted: true does not mean "deleted" in the obvious sense. It means "the item is not currently approved" — which includes ready-for-validation items, rejected items, archived items, and actually-deleted items alike. Use wfstatus to tell them apart.
  • offline: true is identical to published: false. The two booleans always carry the same information; there's no case where one is true and the other isn't.
  • A new TRCItem submitted via a feed comes in as wfstatus: readyforvalidation, which means it has published: false, deleted: true, offline: true. That's expected — it becomes published only after an editor approves it.

Deprecated fields

  • published, deleted, offlinedeprecated. Returned for backwards compatibility; derived as shown above. New integrations should read wfstatus.
  • isprivate — fully deprecated. Not maintained by StatusUtil. Ignore on read; do not set on write.

If you write published, deleted, or offline directly without also setting a matching wfstatus, the server's normalisation will overwrite your booleans on the next save based on wfstatus. To take an item offline, set wfstatus to a non-approved value; to publish, set it to approved.

Per-Entity-Type Variants

EVENEMENT (Event)

The most feature-rich entity type. Events have priceElements, promotions, performers, and support child/parent link types for event series.

LOCATIE (Location)

A geographical point of interest — a museum, park, or monument. Locations do not have priceElements, promotions, or performers. Link types are limited to alias and comment.

VENUE

A business-oriented location — a restaurant, hotel, or conference center. Structurally similar to Location but semantically distinct. The entitytype is always VENUE. See Location vs Venue for when to use which.

EVENTGROUP

A container for grouping related events (e.g., a festival that contains multiple sub-events). Uses child/parent links to connect the group to its member events.

ROUTE

A geographical path with waypoints. Carries a routeInfo object with route type, distance, duration, coordinates, and points of interest.

Feed Ingestion and Update Behavior

When events are submitted via an inbound feed (a partner's HTTPS endpoint), Event Connectors polls the feed approximately every 4 hours. Each event in the feed is matched to an existing TRCItem using the externalId — a composite of the feed name and the id you provide.

New events are created with wfstatus: readyforvalidation. An editor must review and approve the event before it becomes published.

Existing events follow different update rules depending on their status:

StatusBehavior on feed update
Not yet published (readyforvalidation, draft)All fields are overwritten by the feed version
Published (approved + published: true)Only calendar and priceElements are overwritten; editor changes to title, descriptions, media, and other fields are preserved

This means editors can refine text and media for published events without risk of those changes being overwritten by the next feed sync. Calendar and pricing always stay in sync with the source.

Minimal Example

{
  "trcid": "e_abc123",
  "entitytype": "EVENEMENT",
  "wfstatus": "approved",
  "published": true,
  "trcItemDetails": [
    {
      "lang": "nl",
      "title": "Koningsdag Festival",
      "shortdescription": "Jaarlijks festival op Koningsdag",
      "longdescription": "..."
    }
  ],
  "translations": {
    "primaryLanguage": "nl",
    "availableLanguages": ["nl", "en"]
  }
}

Realistic Example

{
  "trcid": "e_abc123",
  "entitytype": "EVENEMENT",
  "wfstatus": "approved",
  "published": true,
  "trcItemDetails": [
    {
      "lang": "nl",
      "title": "Koningsdag Festival",
      "shortdescription": "Jaarlijks festival op Koningsdag",
      "longdescription": "Het grootste Koningsdag festival van de regio..."
    },
    {
      "lang": "en",
      "title": "King's Day Festival",
      "shortdescription": "Annual King's Day festival",
      "longdescription": "The largest King's Day festival in the region..."
    }
  ],
  "translations": {
    "primaryLanguage": "nl",
    "availableLanguages": ["nl", "en"]
  },
  "calendar": {
    "singleDates": [
      {
        "date": "2025-04-27T00:00:00",
        "when": [{ "timestart": "10:00", "timeend": "23:00" }]
      }
    ],
    "calendarType": "SINGLEDATES"
  },
  "location": {
    "address": {
      "city": "Amsterdam",
      "zipcode": "1012 AB"
    }
  },
  "priceElements": [
    {
      "description": {
        "value": "Adults",
        "priceDescriptionValue": "Adults"
      },
      "from": 15.0,
      "till": 15.0
    }
  ]
}

See the API Reference for the full schema definition.

On this page