NEOLearn

Platform API reference

The NEO Platform's HTTP API: protocol, authentication, errors, and every service generated from the API's contract.

Updated October 17, 2026

On this page

The NEO Platform API is what the web app, the Studio and the desktop client use: accounts, games, sessions, the Marketplace, the wallet and the Creator Hub. These pages are generated from the API's contract (its .proto files) and its routes, so every method and field listed here is real.

Protocol#

The API speaks the Connect protocol's unary JSON form. Every method is an HTTP POST to /neo.platform.v1.<Service>/<Method> on your platform's API URL, with a JSON body (Content-Type: application/json). An empty body is the same as {}.

Shell
curl -X POST "$NEO_API/neo.platform.v1.CatalogService/ListExperiences" \
  -H 'Content-Type: application/json' \
  -d '{"sort": "popular"}'

JSON follows the proto3 JSON mapping:

  • Field names are camelCase (displayName); the snake_case names (display_name) are accepted too.
  • 64-bit integers (int64) are JSON strings ("1250"), so they stay exact in JavaScript. Ids are strings.
  • Fields at their default value (0, "", false, empty lists) may be left out of responses: read a missing field as its default.
  • Unknown fields in a request are ignored, so newer clients can talk to older servers.

Authentication#

Methods that need a caller take a bearer token: Authorization: Bearer <access token>. SignIn and SignUp return an access token and a refresh token; Refresh exchanges the refresh token for new ones. Each method's Auth line says what it needs:

AuthWho can call
AccountA signed-in account. Guests get permission_denied.
Account or guestA signed-in account or a guest (see StartGuest).
OptionalAnyone. A signed-in caller gets personalised fields, such as whether they favorited a game.
NoneAnyone.

A token stops working as soon as its device is signed out, the password changes or the account is deleted, not only when it expires.

Scoped tokens. Pages that embed the Studio or the avatar editor get a short-lived scoped token from IssueScopedToken. A scoped token can call only its scope's methods (the studio scope: publishing games; the avatar scope: the AvatarService), each listed on its method below.

The optional x-neo-client header names the client in the account's list of signed-in devices (for example Web · Chrome).

Errors#

A failed call answers with an HTTP error status and a JSON body {"code": "...", "message": "..."}. The message is readable text you can show.

CodeHTTP statusMeaning
invalid_argument400A field is missing or invalid.
failed_precondition400The request is valid but the state doesn't allow it (for example, not enough Credits).
unauthenticated401No token, or the token is invalid or expired.
permission_denied403The caller may not do this (a guest, someone else's game, a scoped token outside its scope).
not_found404The record doesn't exist or isn't visible to the caller.
already_exists409A unique value is taken (a username, for example).
resource_exhausted429Too many requests: slow down and retry.
internal500Something failed on the server.

Services#

ServiceWhat it covers
IdentityServiceAccounts, sign-in, guests, devices and account settings.
SocialServiceProfiles, friends, follows, communities (groups) and blocking.
CatalogServiceGames: creating, publishing versions, discovery, ratings, content uploads and testers.
SessionServiceJoining games: sessions, heartbeats, presence in a session and invites.
EconomyServiceThe wallet, NEO Credits packs, the Marketplace's items, buying and inventory.
AvatarServiceReading and saving the player's avatar.
ChatServiceConversations and read state.
CreatorServiceThe Creator Hub: overview, analytics, sales, uploads and payouts.
SafetyServiceReporting players and experiences to moderation.
DatastoreServiceGame save data: a running game's per-player and shared data, leaderboards, and the player's data export.

Common types#

Types several services use.

Item#

FieldTypeDescription
idstring
kindstringavatar_hat, avatar_shirt, avatar_emote, game_pass, developer_product
namestring
descriptionstring
pricestring (int64)
creatorIdstring
creatorNamestring
experienceIdstring
thumbnailUrlstring
ownedboolean
salesstring (int64)

PageRequest#

FieldTypeDescription
pageSizenumber
pageTokenstring

UserSummary#

A user as other people see them.

FieldTypeDescription
idstring
usernamestring
displayNamestring
headshotUrlstringURL of the avatar headshot (rendered by the platform).

See also#