Middleware SEO Enablement
Status: catalogue discovery is implemented through the existing paginated OVP browse contract. A dedicated feed remains conditional on measured scale, freshness, or availability requirements that the current contract cannot meet.
Provider decision: Record uses JWX as its OVP. New SEO work must not extend the legacy Brightcove webhook or model path.
The original plan proposed a new middleware feed. Record middleware now exposes queryless, paginated catalogue browsing by asset type, so Web can enumerate the currently supported public detail types without adding another endpoint.
Data ownership
record-web owns presentation and request context:
- canonical URLs;
- robots metadata;
- Open Graph and Twitter metadata;
- JSON-LD serialization;
- sitemap XML rendering.
record-mw and JWX own source facts:
- the set of published assets;
- stable IDs and public route inputs;
- publication and availability windows;
- modification timestamps;
- region availability;
- provider events, if JWX exposes a supported event mechanism.
Current record-mw deployment configuration sets
DEFAULT_API_KEY_OVP: JWX. The OVP registry still contains a legacy
Brightcove provider, but that is not authorization to design new Record
features around it.
Priority and launch impact
| Work item | Priority | Launch impact |
|---|---|---|
| Existing cached OVP catalogue browse | Delivered | Supplies concrete Movie, Show, Podcast, Channel, and Radio URLs |
| Dedicated JWX SEO feed | Conditional | Add only if measured requirements exceed the existing browse contract |
| Real modification timestamp | P1 | Omit lastModified until available |
| Availability and regional indexability | P1 | Required when unavailable assets would otherwise enter the feed |
| JWX-driven invalidation | P2 | Freshness enhancement after a supported event source is confirmed |
| Sitemap segmentation | Conditional | Required before any sitemap exceeds 50,000 URLs or 50 MB uncompressed |
1. Concrete catalogue discovery
Problem
Control exposes route templates such as /movie/:assetId; those are routing
instructions, not content URLs. record-web therefore combines Control routes
with the existing OVP catalogue browse contract.
Contract
The current implementation uses the existing read-only endpoint:
GET /v1/ovp/search?assetType={type}&pageSize=50&pageNumber={page}
Contract requirements:
- asset IDs and types are converted to concrete absolute paths beginning with
/by Web; - query strings, fragments, route placeholders, and domains are rejected;
- pagination uses explicit
pageSizeandpageNumbervalues and stops at the first empty page;totalCountis informational because it can change while the catalogue is being enumerated; - unknown asset types are omitted;
- response size and caching use the existing OVP provider controls.
The Web OVP provider caches catalogue pages for five minutes. Web caps pagination at two concurrent requests, retries each failed page once, limits output to the sitemap protocol maximum, and retains completed pages if a later request fails. Do not introduce infrastructure solely for SEO.
Web consumption
record-web validates every entry again before rendering:
- allowed public type;
- non-empty encoded asset identifier;
- concrete safe path;
- duplicate removal.
The existing Control routes remain useful for Home, Category, and Listing pages. Catalogue browsing adds detail URLs; it does not replace Control navigation.
2. Modification timestamps
Expose the actual JWX update timestamp when its semantics are confirmed. Map it to an optional normalized ISO 8601 field.
Rules:
- do not fall back to request, build, publish, or ingestion time unless that is the actual modification event being represented;
- omit invalid and unknown dates;
- render sitemap
lastModifiedonly when the value exists; - test that unchanged assets keep the same timestamp across source requests.
3. Availability and region
The feed should derive indexable from documented product rules:
- published and currently available;
- not expired;
- public in the target Brazil experience;
- not a private, transactional, or playback-only entity.
Do not reuse entitlement or subscription access as an automatic SEO exclusion. A paywalled detail page may still be publicly indexable when it exposes the approved logged-out content.
Detail endpoints need a machine-readable distinction between:
- unknown asset;
- permanently gone asset;
- temporarily unavailable upstream;
- authenticated playback restriction.
record-web can then select 404, 410, 503, or a normal indexable detail page
without turning outages into soft 404 pages.
4. JWX-driven freshness
On-demand revalidation is optional until both conditions hold:
- sitemap or page freshness misses a measured product target;
- JWX provides a supported publication/update event source.
Do not extend apps/webhook-gateway merely because it currently contains
Brightcove-specific code. First choose the supported JWX integration:
- provider webhook;
- queue event;
- scheduled delta poll;
- cache TTL only.
If a push integration is selected:
- authenticate requests with a server-only secret;
- rate limit and deduplicate events;
- invalidate the feed cache;
- revalidate the affected canonical path and sitemap;
- retry safely without logging credentials or full provider payloads.
5. Scale
Google sitemap limits apply per sitemap. Before reaching them:
- segment entries deterministically;
- emit a sitemap index;
- ensure an asset appears in exactly one child sitemap;
- keep every URL absolute and canonical;
- test cursor and segment boundaries.
Do not build segmentation before catalogue measurements justify it.
Out of scope
| Item | Owner |
|---|---|
| Canonical construction | record-web |
| Meta robots, Open Graph, Twitter | record-web |
| JSON-LD serialization and injection safety | record-web |
| Search Console ownership | Release or SEO operations |
| Legacy Brightcove webhook extension | Not an approved Record SEO design |
Required tests
record-mw:
- JWX mapping and supported asset types;
- availability and region decisions;
- timestamp normalization;
- pagination and cache behavior;
- provider failure and stale-cache behavior;
- no credentials or sensitive payloads in logs.
record-web:
- invalid and placeholder catalogue paths are rejected;
- duplicates are removed;
- optional valid timestamps render correctly;
- unavailable entries are absent;
- Control listing URLs and JWX detail URLs combine predictably;
- segmentation when enabled.
Definition of done
- The work is tracked under the existing RECORD SEO epic without duplicate tickets.
- The contract is reviewed by Web and MW owners.
- The implementation uses JWX and contains no new Brightcove dependency.
- The production OVP browse contract enumerates the currently supported Movie, Show, Podcast, Channel, and Radio detail URLs.
- Sitemap output is valid, canonical, complete, and within protocol limits.
- Modification and availability values are source-backed.
- Unit, integration, contract, and failure-path tests pass in both repositories.