Documenting the protocols, structures and concepts used by Hyperscape.
edit | blame | history | raw

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):

"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

{
  "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:

$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)
  1. Characteristics — Set obj.characteristic to "New" or "Updated" to show a badge, or omit for no badge.

  2. Menu links let you navigate the player to in-game screens (Battlepass, Challenges, Shop, HallOfChampions).

  3. Empty news — Returning {"news": []} is valid and will show no news items in the menu.

  4. Polling — The game re-fetches news every 15 minutes (spacesNewsSec: 900, profilesNewsSec: 900 in GameConfigClient).