# Ubisoft Services: News This page documents the in-game news system used by Hyper Scape. News items appear in the main menu as a carousel banner (Billboard), thumbnail cards (MenuThumbnail), and detail views (MenuDetail). ## Endpoints The game fetches news from two endpoints. Both return the same structure but differ in whether `profileId` is populated. ### Profile News ``` GET /v1/profiles/me/news?spaceId={spaceId} ``` Returns news items with `profileId` set to the authenticated player's profile ID. ### Space News ``` GET /v1/spaces/news?spaceId={spaceId} ``` Returns news items with `profileId` set to `null`. ### Headers | Header | Value | |--------|-------| | Authorization | `Ubi_v1 t={ticket}` | | Content-Type | `application/json` | | Ubi-AppId | `69e55abd-5aca-4eee-be94-ce3944c72e73` | | Ubi-SessionId | `{sessionId}` | | Ubi-localeCode | `en-US` | | Ubi-Market | `US` | **Host:** `public-ubiservices.ubi.com` ### Query Parameters | Parameter | Description | |-----------|-------------| | spaceId | `3f28fbeb-1eaa-460f-9265-2ef2a47fd152` | ### Polling Interval From the GameConfigClient, both news endpoints are polled every 900 seconds (15 minutes): ```json "spacesNewsSec": 900, "profilesNewsSec": 900 ``` --- ## Response Structure Both endpoints return `{ "news": [...] }`. The array contains news item objects. ### News Item Fields | Field | Type | Description | |-------|------|-------------| | spaceId | string | Space UUID (`3f28fbeb-...`) | | newsId | string | Unique ID for the news item (e.g. `ignt.25595`) | | type | string | News type, always `featured` | | placement | string | Where this entry appears: `Billboard`, `MenuThumbnail`, or `MenuDetail` | | priority | number | Sort order (lower = higher priority) | | displayTime | number | Billboard carousel display time in seconds | | publicationDate | string | ISO 8601 publication date (no timezone) | | expirationDate | string/null | ISO 8601 expiration date, or `null` for no expiration | | locale | string | Locale code (e.g. `en-US`) | | title | string | News headline (displayed in uppercase in-game) | | contentType | string | Content format, always `plaintext` | | body | string | Full news text with `\n` line breaks | | isBodyFilledIn | boolean | Always `true` | | mediaURL | string | Image URL | | mediaType | string | Media type, always `Image` | | profileId | string/null | Player's profile UUID (profile news) or `null` (space news) | | obj | object | Metadata object | | obj.characteristic | string | Badge label: `"New"`, `"Updated"`, or omit for none | | summary | string | Short description shown in the thumbnail card | | links | array | Action links (see below) | | tags | array | String tags for categorization | --- ## Placements Each logical news item needs **3 entries** in the array — one per placement: | Placement | Where it Shows | Image Size | |-----------|---------------|------------| | Billboard | Main menu carousel (large banner) | ~946 x 632 px | | MenuThumbnail | Small card in the news list | ~494 x 500 px | | MenuDetail | Expanded detail view when card is clicked | ~946 x 632 px | All three entries share the same `newsId`, `title`, `body`, `summary`, and other text fields. Only the `placement` and `mediaURL` differ (Billboard and MenuDetail use the large image, MenuThumbnail uses the small one). --- ## Links Links define what happens when the player clicks the news item's call-to-action button. | Field | Type | Description | |-------|------|-------------| | rootLinkNoId | string | Unique UUID for the link | | type | string | Link type: `menulink` or `weblink` | | param | string | Target — see table below | | actionName | string | Button text (e.g. `"visit"`) | | actionDescription | string | Optional description, usually empty | ### Menu Link Targets | param Value | Navigates To | |-------------|-------------| | Battlepass | Battle Pass screen | | Challenges | Challenges screen | | Shop | In-game shop | | HallOfChampions | Hall of Champions screen | ### Web Link For `type: "weblink"`, the `param` field contains a URL that opens in the player's browser. --- ## Example Response ```json { "news": [ { "spaceId": "3f28fbeb-1eaa-460f-9265-2ef2a47fd152", "newsId": "ignt.25595", "type": "featured", "placement": "Billboard", "priority": 1, "displayTime": 1, "publicationDate": "2021-03-30T13:27:00", "expirationDate": null, "locale": "en-US", "title": "SEASON 3 BATTLE PASS AVAILABLE", "contentType": "plaintext", "body": "The Season 3 Battle Pass is now available! Head to the Battle Pass portal for more details. Complete Challenges to level up your 100-tier Battle Pass!\n\nDon't forget that you can also earn Battle Points by watching HYPER SCAPE\u2122 on Twitch.TV with the Crowncast extension!", "isBodyFilledIn": true, "mediaURL": "https://ubiservices.cdn.ubi.com/3f28fbeb-1eaa-460f-9265-2ef2a47fd152/news/S3_BP_494x500.png", "mediaType": "Image", "profileId": "805f5ad9-1b7b-4a1d-8eb8-b040008e403f", "obj": { "characteristic": "New" }, "summary": "The Season 3 Battle Pass is now available! Complete the new 100-tier Battle Pass and get awesome exclusive cosmetic in-game rewards!", "links": [ { "rootLinkNoId": "afb511da-1db5-04ac-f326-a50e73952a95", "type": "menulink", "param": "Battlepass", "actionName": "visit", "actionDescription": "" } ], "tags": ["S2_BattlePass"] }, { "spaceId": "3f28fbeb-1eaa-460f-9265-2ef2a47fd152", "newsId": "ignt.25595", "type": "featured", "placement": "MenuThumbnail", "...": "same fields, same mediaURL for thumbnail" }, { "spaceId": "3f28fbeb-1eaa-460f-9265-2ef2a47fd152", "newsId": "ignt.25595", "type": "featured", "placement": "MenuDetail", "mediaURL": "https://ubiservices.cdn.ubi.com/.../S3_BP_946x632.png", "...": "same fields, larger image for detail view" } ] } ``` ### Original Captured News Items The last captured response from Ubisoft contained 2 news items (6 entries total — 3 placements each): | newsId | Title | Links To | Tags | |--------|-------|----------|------| | ignt.25595 | SEASON 3 BATTLE PASS AVAILABLE | Battlepass (menulink) | S2_BattlePass | | ignt.25596 | OBTAIN THE MEMORY SHARDS | Challenges (menulink) | S3_Shards | --- ## Serving News for Scapegoat The existing `NewsController.php` already handles both endpoints. Here's how news items are structured for the private server: ### Defining a News Item Each news definition is expanded into 3 placement entries automatically. You only need to define it once: ```php $newsDefinitions = [ [ 'newsId' => 'custom.001', 'type' => 'featured', 'priority' => 1, 'displayTime' => 1, 'publicationDate' => '2026-02-17T00:00:00', 'expirationDate' => null, 'title' => 'WELCOME TO SCAPEGOAT', 'contentType' => 'plaintext', 'body' => "Welcome to Scapegoat!\n\nBody text here...", 'summary' => 'Short description for the thumbnail card.', 'obj' => ['characteristic' => 'New'], 'links' => [], 'tags' => ['welcome'], 'mediaURL_large' => 'https://example.com/banner_946x632.jpg', 'mediaURL_small' => 'https://example.com/thumb_494x500.jpg', ], ]; ``` ### Key Implementation Notes 1. **Both endpoints return the same data** — the only difference is whether `profileId` is populated (profile news) or `null` (space news). 2. **Each logical news item = 3 array entries** — one for Billboard, MenuThumbnail, and MenuDetail. All share the same `newsId`. 3. **Image sizes matter:** - Billboard & MenuDetail: ~946 x 632 px (large banner) - MenuThumbnail: ~494 x 500 px (small card) 4. **Characteristics** — Set `obj.characteristic` to `"New"` or `"Updated"` to show a badge, or omit for no badge. 5. **Menu links** let you navigate the player to in-game screens (Battlepass, Challenges, Shop, HallOfChampions). 6. **Empty news** — Returning `{"news": []}` is valid and will show no news items in the menu. 7. **Polling** — The game re-fetches news every 15 minutes (`spacesNewsSec: 900`, `profilesNewsSec: 900` in GameConfigClient).