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:
callBackUrlis now editable viaPUT /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 asigningSecretreturned once in that response. (Previously the OpenAPI spec saidcallBackUrlwas not changeable on update.)- New
POST /accounts/{accountId}/tokens/{tokenId}/rotate-secretre-mints thesigningSecretand returns it once (the previous one stops verifying immediately); it requires the token to have acallBackUrl. 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/signinis now documented asPOSTwith a JSON body returning an OAuth-styleTokenResponse(access_token,expires_in,refresh_token);/auth/logoutreturns200 {message}and revokes the session (no redirect).authentication.mdxnow distinguishes the long-lived account API token (for integrations) from the short-lived session token (1h JWT, first-party sign-in). - Account tokens: documented
PUTandDELETE /accounts/{accountId}/tokens/{tokenId}, and added the structuredapiTokenFilterscope model (ApiTokenFilter/AxisSpec/GeoSpec),filter, anduseOptimizedImagesto theApiTokenschema. - Routes: documented
GET /routes/{id}/geojsonandGET /routes/{id}/gpxper-route downloads. - Events: documented the
excludePatternDatesquery parameter on the events list. - Assets: corrected
GET /assetsto return a page (AssetPage), not a single asset; documented thePUT /assets/{id}metadata endpoint, the upload size limit (413) and accepted MIME types (415) onPOST /assets, and expanded theAssetschema with the metadata fields it actually returns.file.mdxnow clarifies that 7–10 MB is a quality guideline, not the upload hard limit. - Translations: replaced stale
en-GBreferences withenin the keywords/markers examples. - TypeScript schemas:
zodships 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. OlderFETCHED + converted=falseentries 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:
EVENEMENTGROEPrenamed toEVENTGROUP. - Promotion: added
externalReferencefield 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-onlyschemaOrgJsonLd. - File: added
webpto the FileType enum; addedfloorplanto the MediaType enum. - Contactinfo: added
homepageto the URLServiceType enum. - DataType enum: extended with
data,url,email,phonevalues for richer category typing. - OpenAPI spec: lint-clean under
@redocly/cliwith 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.