Appearance
Getting started
The fastest way to learn this API is to make one session, then one authenticated GET. Everything else is the same pattern with a different path, app ID, or ticket exchange.
1. Pick a host
Production is what almost every tool uses:
| Role | Host |
|---|---|
| Almost all REST | https://public-ubiservices.ubi.com |
| Web SSO / Connect | https://connect.ubisoft.com |
| Account ecom (USS / SCS / ESS) | See Environments → Ecommerce |
Other environments live on Environments.
2. Create a session
POST /v3/profiles/sessions with Basic auth and the main auth app ID.
http
POST https://public-ubiservices.ubi.com/v3/profiles/sessions
Authorization: Basic {base64(email:password)}
Ubi-AppId: 4391c956-8943-48eb-8859-07b0778f47b9
Ubi-RequestedPlatformType: uplay
Content-Type: application/jsonA JSON body is typically {} or { "rememberMe": true }.
Read the response as a Session. Do not treat HTTP 200 as a full login. If ticket is null and twoFactorAuthenticationTicket is set, you have a limited-scope 2FA ticket, or you can complete 2FA with Ubi_2fa_v1 + ubi-2facode to get a real ticket.
3. Call anything else with the ticket
http
GET https://public-ubiservices.ubi.com/v3/users/me
Authorization: ubi_v1 t={ticket}
Ubi-AppId: 4391c956-8943-48eb-8859-07b0778f47b9
Ubi-SessionId: {sessionId}
Ubi-RequestedPlatformType: uplay
Ubi-LocaleCode: en-US
Content-Type: application/jsonThat header set is defined once on Headers. Endpoint pages only mention extras.
4. Exchange the ticket when the app ID changes
A ticket is scoped to the Ubi-AppId that created it. Marketplace, support cases, R6 PC consent, and several other surfaces need a different app ID. Re-POST the same sessions path with Authorization: ubi_v1 t={ticket} and the new app ID — see Ticket exchange.
Suggested first reads
- Authentication — password, 2FA tickets, ticket lifetime
- User & profile —
/v3/users/me, linked platforms - Inventory or Stats if you are building R6 tools
- GraphQL if you are touching the marketplace
Tooling
Any REST client works (Insomnia, Bruno, REST Client, curl). There is no official SDK. Generate code from a saved request once you have a ticket; don't hard-code passwords in source.