Event Connectors

Changelog

Spec and behavior changes for the Event Connectors API

June 2026 — Webhook signing implemented + secret rotation

ff-api now implements the webhook delivery contract end-to-end (HMAC-SHA256 signing, at-least-once delivery with exponential-backoff retries to ~24h, a durable queue, and the X-EventConnectors-* headers) — the docs-ahead-of-code gap noted in docs/adr/0001-webhook-delivery-contract.md is closed.

Two contract changes followed:

  • callBackUrl is now editable via PUT /accounts/{accountId}/tokens/{tokenId}: omit it to leave the webhook unchanged, send an empty string to remove it (and its secret), or set a URL to register one. Adding a callback to a token that had none mints a signingSecret returned once in that response. (Previously the OpenAPI spec said callBackUrl was not changeable on update.)
  • New POST /accounts/{accountId}/tokens/{tokenId}/rotate-secret re-mints the signingSecret and returns it once (the previous one stops verifying immediately); it requires the token to have a callBackUrl. This is the documented way to recover a lost secret and how pre-signing callback-tokens obtain their first one. The Webhooks guide gained "Changing or removing the callback URL" and "Rotating the signing secret" sections.

Token create/update/delete and rotate-secret accept ROLE_ADMIN or ROLE_SUPER_ADMIN.

June 2026 — API Reference Sync (2-month backend review)

Audited two months of ff-api and ndtrc_model commits and brought the docs back in line with the API:

  • Auth: /auth/signin is now documented as POST with a JSON body returning an OAuth-style TokenResponse (access_token, expires_in, refresh_token); /auth/logout returns 200 {message} and revokes the session (no redirect). authentication.mdx now distinguishes the long-lived account API token (for integrations) from the short-lived session token (1h JWT, first-party sign-in).
  • Account tokens: documented PUT and DELETE /accounts/{accountId}/tokens/{tokenId}, and added the structured apiTokenFilter scope model (ApiTokenFilter/AxisSpec/GeoSpec), filter, and useOptimizedImages to the ApiToken schema.
  • Routes: documented GET /routes/{id}/geojson and GET /routes/{id}/gpx per-route downloads.
  • Events: documented the excludePatternDates query parameter on the events list.
  • Assets: corrected GET /assets to return a page (AssetPage), not a single asset; documented the PUT /assets/{id} metadata endpoint, the upload size limit (413) and accepted MIME types (415) on POST /assets, and expanded the Asset schema with the metadata fields it actually returns. file.mdx now clarifies that 7–10 MB is a quality guideline, not the upload hard limit.
  • Translations: replaced stale en-GB references with en in the keywords/markers examples.
  • TypeScript schemas: zod ships as a regular dependency (installed automatically), not a peer dependency.

June 2026 — Webhooks Documented

A new Webhooks page documents how the Event Connectors API notifies consumers of TRCItem changes. It covers registration (the token callBackUrl and the once-only signingSecret), the ten event types across Event, Location, Route, EventGroup, and Venue, the batched CallbackBody payload, signature verification (HMAC-SHA256 over timestamp + "." + rawBody, with X-EventConnectors-Timestamp / X-EventConnectors-Signature and 300s replay protection), at-least-once delivery with deduplication via X-EventConnectors-Delivery, exponential-backoff retries up to ~24h, and the 5-second ack contract.

The OpenAPI spec was updated to match this contract: callBackUrl is now writable on token creation, a read-only signingSecret is returned once, CallbackItem.resourceType gained ROUTE/EVENTGROUP/VENUE, and all ten callbacks now document the signature/timestamp/delivery headers and retry semantics. This contract is documented ahead of the ff-api implementation (see docs/adr/0001-webhook-delivery-contract.md).

May 2026 — Bounded Feed Dev-Loop Runs (Admin)

The admin-only POST /api/feeds/{feedID}/fetchAndConvertOnce endpoint, used by the internal feed-administration tooling, gained two optional query parameters for bounded dev-loop runs:

  • size (1–1000): caps the number of upstream entries pulled in this run, and scopes the subsequent location-mapper / convert / import phases to only those entries. Older FETCHED + converted=false entries on the feed are left untouched.
  • feedInfoId: forwarded to the upstream feed service to scope the fetch to a single sub-feed.

Both parameters are optional and combine freely. Without size, the endpoint behaves as before (full async run). When externalID is supplied, size is ignored. This change is API-additive and not visible to public consumers of the Event Connectors API.

May 2026 — TypeScript Schemas Page Added

A new TypeScript schemas page documents @eventconnectors/ndtrc_model, the Zod schema package for the NDTRC domain model. Developers can install the package to validate API payloads at runtime, infer TypeScript types from the schemas, and catch shape drift in CI. The page covers the response/draft schema split, entity-type aliases (Event, Venue, Route, …), the default .passthrough() policy and .strict() opt-in, extending schemas with .extend(), and a full surface-area table of exported schemas with links into the relevant concept pages.

May 2025 — Rebrand and ndtrc-model 1.2.1 Sync

Brand rename: The product is now Event Connectors (two words). All user-facing prose, the API host, and documentation have been updated from "FeedFactory" / "The Feed Factory" to Event Connectors. The production API host is now https://app.eventconnectors.nl/api. Legacy app.thefeedfactory.nl URLs continue to work but should be updated.

ndtrc-model 1.2.1 sync — the OpenAPI specification was updated to match the latest data model:

  • EntityType: EVENEMENTGROEP renamed to EVENTGROUP.
  • Promotion: added externalReference field for linking promotions to external system identifiers.
  • SeoMetadata: full model added — per-language SeoDetail (metaTitle, metaDescription, OG image/type, Twitter card type), CanonicalConfig, and read-only schemaOrgJsonLd.
  • File: added webp to the FileType enum; added floorplan to the MediaType enum.
  • Contactinfo: added homepage to the URLServiceType enum.
  • DataType enum: extended with data, url, email, phone values for richer category typing.
  • OpenAPI spec: lint-clean under @redocly/cli with zero errors and zero warnings.

Documentation site: Replaced the nginx + Swagger UI container with a Fumadocs (Next.js + MDX) documentation site at docs.eventconnectors.nl, including concept pages, recipes, and an interactive API reference powered by Scalar.

On this page