OUYA store API documentation

This is an attempt to document the API used by OUYA gaming consoles to speak with devs.ouya.tv.

Contents

Standard HTTP headers

The following HTTP headers are sent with nearly every HTTP request from the OUYA console to the servers.

Accept-Encoding

gzip

The OUYA understands gzip compression

Accept-Language

en-US,en

User-Agent

OUYA 0 1.00 1.2.1427_r1

X-OUYA-AuthToken

96bfeaae-212d-447b-b4bf-caa5e86c0502

Authentication token one got from logging in.

Only sent when logged in.

X-OUYA-Console-Id

015d4b33bc64141b

Serial number you see when running $ adb devices

X-OUYA-Console-Wifi-MAC-Address

B8:5A:F7:82:3C:C8

X-OUYA-Device

ouya_1_1

Probably hardware revision

X-OUYA-Firmware-Version

1.2.1427_r1

X-OUYA-VersionCode

16

X-Token

96bfeaae-212d-447b-b4bf-caa5e86c0502

Only sent when logged in.

Same as X-OUYA-AuthToken.

FIXME: Why two token headers?

FIXME: Why auth_token GET parameter when there are headers?

Headers to ignore

Cookie

__cfduid=da019d762142461c19f162c0ee443f9c71434577887

Comes from the cloudflare error page. Can be ignored.

Cookie2

$Version=1

??? FIXME

Not on the cloudflare error page.

POST https://ott9.wpstn.com/live/

Store credit card data.

Usage

Called after fetching a one time token from POST https://devs.ouya.tv/api/v1/credit_card.

HTTP request

Protocol

https

Method

POST

Host

ott9.wpstn.com

Path

/live/

Headers
Content-Type

application/x-www-form-urlencoded

User-Agent

OUYA 0 1.00 1.2.1427_r1

POST parameters
Action:

Add

OTT:

Random one-time token from credit card POST request.

AcctName:

Credit card account holder name

AcctNumber:

4111111111111111

Credit card number

ExpDate:

012017

Month & year

CVN:

777

Secret code

Email:

E-mail address

ZipCode:

Postal code

HTTP response

Status code

303 See Other

Redirects to wpsuccess URL on devs.ouya.tv with the OTT parameter:

https://devs.ouya.tv/wpsuccess?OTT=C187D8AE8970...

The redirect location header seems to be ignored; it does not get called. Instead, PUT https://devs.ouya.tv/api/v1/credit_card is fetched.

GET http://status.ouya.tv/api/v1/status

Check if the internet connection is working by fetching an empty file.

HTTP request

Protocol

http

Method

GET

Host

status.ouya.tv

Path

/api/v1/status

Headers

None of the standard headers.

User-Agent

Ouya-Connection-Test

HTTP response

Status code

204 No Content

Empty body.

GET https://devs.ouya.tv/api/firmware_builds

List the latest available firmware version.

Usage

  1. During the OUYA setup (Parameter oobe=true is set)

  2. During bootup

  3. Every 3 minutes unless an "Expires" header is set

HTTP request

Protocol

https

Method

GET

Host

devs.ouya.tv

Path

/api/firmware_builds

Headers

Standard headers

Token parameters not required.

GET parameters
auth_token

May be empty.

Does not seem to have any influence on the response.

oobe

true

Optional.

Is set once during the OUYA setup (Out Of Box Experience).

HTTP response

Status code

200 OK

Content type

application/json; charset=utf-8

Example

{
  "result": [
    {
      "incremental": false,
      "filename": "OUYA-1.2.1427-r1.zip",
      "timestamp": "1418407476",
      "md5sum": "3a95be82b4c33bd68353dc314346f39f",
      "channel": "stable",
      "url": "http://cds.t2z5c2q6.hwcdn.net/ota/RC-OUYA-1.2.1427-r1_ota.zip",
      "requiredUpto": "1.2.995",
      "changes": "https://devs.ouya.tv/api/changelog/3a95be82b4c33bd68353dc314346f39f.txt",
      "changesLocalized": {
        "de": " <!doctype html>\r\n<html>\r\n...",
        "it": "<!doctype html>\r\n<html>\r\n..",
        "fr": "<!doctype html>\r\n<html>\r\n..",
        "es": "<!doctype html>\r\n<html>\r\n..",
        "en": "<!doctype html>\r\n<html>\r\n.."
      }
    }
  ]
}

GET https://devs.ouya.tv/api/v1/apps/xxx

Fetch the details for an app/game.

Usage

Related to api/v1/details, which is used for already installed apps.

HTTP request

Protocol

https

Method

GET

Host

devs.ouya.tv

Path

/api/v1/apps/xxx

xxx

Package name of an app

Also UUID of a package release.

Example: /api/v1/apps/com.toa.tetrisFusionOuya

Headers

Standard headers

console_id

Same as X-OUYA-Console-Id

GET parameters
auth_token

Same as X-OUYA-AuthToken

HTTP response

Status code

200 OK

Content-type

application/json; charset=utf-8

Example

{
  "app": {
    "videoUrl": null,
    "publishedAt": "2014-12-05T20:30:48Z",
    "firstPublishedAt": "2014-08-25T03:35:11Z",
    "latestVersion": "0fba3bba-83e0-4e3e-9f29-409258429757",
    "promotedProduct": {
      "originalPrice": 4.49,
      "localPrice": 4.49,
      "percentOff": 0,
      "description": "Play head-to-head against another opponent. If you don't have a second controller connected, you can play against a CPU-controlled opponent.",
      "currency": "EUR",
      "name": "2P VS Battle Mode",
      "identifier": "TBOE_Mode2P_1-50"
    },
    "genres": [
      "Puzzle/Trivia",
      "Arcade/Pinball",
      "Retro"
    ],
    "premium": false,
    "description": "Tetris® Battle: Fusion is now available on OUYA!  Based on Tetris Battle, the hugely popular multiplayer game on Facebook that has been downloaded over 60 million times, Tetris Battle: Fusion introduces an all-new interactive adventure where you can battle your way through a series of challenging opponents and goals to become a Tetris Master!  Collect special Amulets that can be used to give you an added boost as you progress your way to victory.  Over 50 Amulets are ready to collect, and more will be added periodically. With the help of Amulets, don't change the way you play ... change the way you WIN!  The game also features a 1v1 local co-op mode that enables friends in the same room to go head-to-head using previously earned Amulets.\r\n\r\nPLEASE NOTE: This app contains in-app purchasing, which allows you to buy items within the app using actual money.",
    "developer": "Tetris Online, Inc.",
    "gamerNumbers": [
      1
    ],
    "ratingCount": 861,
    "ratingAverage": 3.73,
    "apkFileSize": 41125055,
    "founder": false,
    "mainImageFullUrl": "https://devs-ouya-tv-prod.s3.amazonaws.com/apps/a137f31c-ad28-47e6-ae43-0a346ebe249a/com.toa.tetrisFusionOuya/0fba3bba-83e0-4e3e-9f29-409258429757/ouya_icon.png",
    "website": "www.tetrisonline.com",
    "supportPhone": null,
    "supportEmailAddress": "support@tetrisonline.com",
    "title": "Tetris Battle Fusion",
    "uuid": "0fba3bba-83e0-4e3e-9f29-409258429757",
    "versionNumber": "2.0.1r",
    "likeCount": 0,
    "overview": "Released in December 2014 by Tetris Online, Inc..",
    "filepickerScreenshots": [
      "https://www.filepicker.io/api/file/fio2PmJQQla1fZdVEZxl",
      "https://www.filepicker.io/api/file/VESfV97VTSn4uRp5lY9A",
      "https://www.filepicker.io/api/file/To75Tn2Tw6J7nvPG4nBk",
      "https://www.filepicker.io/api/file/bjzlwTjvQe6HA4awlHTw",
      "https://www.filepicker.io/api/file/qcQEibHxT9Wa1PCoMpX2",
      "https://www.filepicker.io/api/file/kQKVJ2xyRnCnmysUjZkD",
      "https://www.filepicker.io/api/file/8zJEBwIBTmoFNiJyLKoY",
      "https://www.filepicker.io/api/file/zTnyJklUSYOlpJ1E04fH"
    ],
    "contentRating": "Everyone",
    "md5sum": "ad1f58f365859e5bc0db8c237b4c4514",
    "publicSize": 258150,
    "nativeSize": 5607144
  }
}

GET https://devs.ouya.tv/api/v1/apps/xxx/download

Fetch the download link for a specific version of an app.

Usage

HTTP request

Protocol

https

Method

GET

Host

devs.ouya.tv

Path

/api/v1/apps/xxx/download

xxx

latestVersion string from the apps details page

Example: /api/v1/apps/0fba3bba-83e0-4e3e-9f29-409258429757/download

Headers

Standard headers

GET parameters
auth_token

Same as X-OUYA-AuthToken

HTTP response

Status code

200 OK

Content-type

application/json; charset=utf-8

Example

{
  "app": {
    "downloadLink": "http://cds.t2z5c2q6.hwcdn.net/apps/a137f31c-ad28-47e6-ae43-0a346ebe249a/com.toa.tetrisFusionOuya/0fba3bba-83e0-4e3e-9f29-409258429757/Gx9cZz0KTRCNstv78Mq5_ToaFusionOuya-2.0.1r.apk",
    "contentRating": "Everyone",
    "version": "0fba3bba-83e0-4e3e-9f29-409258429757",
    "fileSize": 41125055
  }
}

GET https://devs.ouya.tv/api/v1/console_configuration

Sets Android system properties. Allows to enable debug or kiosk mode remotely.

This file is downloaded every hour.

See Configuration options.

HTTP request

Protocol

https

Method

GET

Host

devs.ouya.tv

Path

/api/v1/console_configuration

Headers

Standard headers

GET parameters
auth_token

May be empty.

Does not seem to have any influence on the response.

HTTP response

Status code

200 OK

Example

{"BTC_LAUNCHER_PACKAGES":"tv.ouya.xbmc,tunein.player,tv.twitch.android.viewer,com.plexapp.android,tv.ouya.bbciplayer,tv.ouya.hulu,tv.ouya.minecrafttv,tv.ouya.ouyabrowser,tv.ouya.pandora,tv.ouya.visiomgo,tv.ouya.youtube,tv.ouya.tubitv"}

POST https://devs.ouya.tv/api/v1/crash_report

When the OUYA launcher crashed, it saves a crash log. When the OUYA reboots, it tries to send the crash log data to this URL.

FIXME

POST https://devs.ouya.tv/api/v1/credit_card

Prepare the credit card registration process and fetch a one-time token for the wpstn.com (world pay) credit card processor.

HTTP request

Protocol

https

Method

POST

Host

devs.ouya.tv

Path

/api/v1/credit_card

Headers

Standard headers

Content-Type

application/x-www-form-urlencoded

GET parameters
auth_token

Same data as in standard header X-OUYA-AuthToken

zipcode

Postal code entered on the credit card form.

POST parameters
auth_token:

Same data as in standard header X-OUYA-AuthToken

HTTP response

Status code

200 OK

Content type

application/json; charset=utf-8

Example:

{
  "one_time_token": "C187D8AE8970435C9638C58C8351E2DEF975680B737A4B55A3D314BF0C477F2A",
  "redirect_url": "https://ott9.wpstn.com/live/"
}

The one_time_token is used in the following POST request to the URL determined in redirect_url.

See POST https://ott9.wpstn.com/live/.

PUT https://devs.ouya.tv/api/v1/credit_card

Store the result of the credit card storage request.

Usage

Called after POST https://ott9.wpstn.com/live/.

HTTP request

Protocol

https

Method

PUT

Host

devs.ouya.tv

Path

/api/v1/credit_card

Headers

Standard headers

Content-Type

application/x-www-form-urlencoded

GET parameters
auth_token

Same data as in standard header X-OUYA-AuthToken

body:

Complete response including headers

zipcode:

Postal code

POST parameters
auth_token

Same data as in standard header X-OUYA-AuthToken

Example body parameter:

HTTP/1.1 303 See Otherlocation: https://devs.ouya.tv/wpsuccess?OTT=C187D8AE8970435C9638C58C8351E2DEF975680B737A4B55A3D314BF0C477F2A
Content-Length: 9
Via: 1.1 localhost (Apache-HttpClient/UNAVAILABLE (cache))
Date: Wed, 17 Jun 2015 21:51:23 GMT
See Other

HTTP response

Status code

200 OK

Content type

application/json; charset=utf-8

Example:

{
    "country": null,
    "success": true
}

GET https://devs.ouya.tv/api/v1/details

Detail page for an app bundle.

Also used as detail page for installed games when opened through the "Play" section.

If there are no details available, the error code 2005 needs to be returned. Otherwise opening the details for an installed but unlisted game will fail on the OUYA.

HTTP request

Protocol

https

Method

GET

Host

devs.ouya.tv

Path

/api/v1/details

Headers

Standard headers

GET parameters
auth_token

Same as X-OUYA-AuthToken

page

UUID of the bundle page to show

Example: be239ca4-10fd-42dd-89cd-1806e80b1362

app

Package name of an app.

Example: org.blockinger.game

developer

UUID of the developer

Example: 5b015434-8a78-4274-aa5d-0cb2e330e50e

community_content

UUID of a community content module

Only one of app, developer or page is provided.

HTTP response

Status code

200 OK

Content-type

application/json; charset=utf-8

Response body definition

ccUrl

Show community content for this game

developer.url

Not set for everyone. If set, a "Developer page" button is shown on the game details screen.

Example when set: ouya://launcher/details?developer=92345f8d-ddbd-43f2-afcf-2628b1234713

metaData

Array of strings that determine which data are shown in the top row.

Allowed values:

  • key:rating.average: Shows the rating stars from rating.average

  • key:apk.fileSize: Shows the apk.fileSize as readable size with unit.

  • key:twitterHandle: Shows the twitterHandle property, automatically prefixes an "@".

  • Any string value beginning with "key:" fetches the key path from JSON, e.g. developer.name.

  • Any string value that does not begin with key: is shown as-is.

promotedProduct

When set, the "Buy" button is shown on the details screen.

Example: App

{
  "type": "Game",
  "title": "BombSquad",
  "description": "8 Player Party Game Madness!\nBlow up your friends in mini-games ranging from capture-the-flag to hockey.\nFeaturing gratuitous explosions, advanced ragdoll face-plant physics, pirates, ninjas, barbarians, insane chefs, and more.\nSupports PS3 controllers, XBox 360 controllers, most USB/Bluetooth gamepads, and even iOS and Android devices as controllers via the free 'BombSquad Remote' app.\nBombs Away!\n\nVersion history:\n1.4.123 - Account unlinking & bug fixes\n1.4.116 - Bug fixes\n1.4.113 - Bug fixes\n1.4.105 - Shields now lose health over time and spinning too long causes you to pass out\n1.4.99 - Better language support in net-games\n1.4.98 - New netplay features such as kick votes\n1.4.94 - More netplay performance improvements\n1.4.93 - Netplay performance improvements\n1.4.88 - Public internet parties\n1.4.69 - Bug fixes and polishing\n1.4.66 - Easter edition!\n1.4.62 - new characters and bug fixes\n1.4.47 - bug fixes\n1.4.38 - bug fixes\n1.4.32 - more icons, bug fixes, and UI improvements\n1.4.17 - new global player profiles and custom icons\n1.4.16 - added continues and polishing\n1.4.14 - bug fixes\n1.4.11 - New tournament and league functionality\n1.4.9 - Santa and Frosty are back for the holidays! Also a new map and new tournament.\n1.4.8 - added Bernard the Bear and new tournament types",
  "mediaTiles": [
    {
      "type": "video",
      "url": "http://vimeo.com/81224217"
    },
    {
      "type": "image",
      "urls": {
        "thumbnail": "https://s3.amazonaws.com/ouya-screenshots/3ae8fc67-f7f5-4f97-a48c-8ea2d31460fd/thumbnail20170911-3-4r3lgn.png",
        "full": "https://s3.amazonaws.com/ouya-screenshots/3ae8fc67-f7f5-4f97-a48c-8ea2d31460fd/ouya-image20170911-3-1ja1uwj"
      },
      "fp_url": "https://www.filepicker.io/api/file/75dSamHkQiuKpg7o3DXF"
    },
    {
      "type": "image",
      "urls": {
        "thumbnail": "https://s3.amazonaws.com/ouya-screenshots/3ae8fc67-f7f5-4f97-a48c-8ea2d31460fd/thumbnail20170911-3-14kztkg.png",
        "full": "https://s3.amazonaws.com/ouya-screenshots/3ae8fc67-f7f5-4f97-a48c-8ea2d31460fd/ouya-image20170911-3-jg5ypv"
      },
      "fp_url": "https://www.filepicker.io/api/file/g0sFFV1Tc2gidAYkaQPU"
    },
    {
      "type": "image",
      "urls": {
        "thumbnail": "https://s3.amazonaws.com/ouya-screenshots/3ae8fc67-f7f5-4f97-a48c-8ea2d31460fd/thumbnail20170911-3-csiwp7.png",
        "full": "https://s3.amazonaws.com/ouya-screenshots/3ae8fc67-f7f5-4f97-a48c-8ea2d31460fd/ouya-image20170911-3-s0jlzk"
      },
      "fp_url": "https://www.filepicker.io/api/file/zswgv6FOQcqZWt7oyV00"
    },
    {
      "type": "image",
      "urls": {
        "thumbnail": "https://s3.amazonaws.com/ouya-screenshots/3ae8fc67-f7f5-4f97-a48c-8ea2d31460fd/thumbnail20170911-3-1615w0d.png",
        "full": "https://s3.amazonaws.com/ouya-screenshots/3ae8fc67-f7f5-4f97-a48c-8ea2d31460fd/ouya-image20170911-3-jcvr8g"
      },
      "fp_url": "https://www.filepicker.io/api/file/51a1JNYKRaeQAAVeNedw"
    },
    {
      "type": "image",
      "urls": {
        "thumbnail": "https://s3.amazonaws.com/ouya-screenshots/3ae8fc67-f7f5-4f97-a48c-8ea2d31460fd/thumbnail20170911-3-1ryqwq9.png",
        "full": "https://s3.amazonaws.com/ouya-screenshots/3ae8fc67-f7f5-4f97-a48c-8ea2d31460fd/ouya-image20170911-3-pom01u"
      },
      "fp_url": "https://www.filepicker.io/api/file/0dnBNiw2Sser5X8kpezG"
    }
  ],
  "heroImage": {
    "url": "https://s3.amazonaws.com/ouya-screenshots/b9fea1c7-c0d9-445f-b424-471c1d9446d8/ouya-image20161126-3-1x3bs88"
  },
  "mobileAppIcon": "https://s3.amazonaws.com/ouya-screenshots/3ae8fc67-f7f5-4f97-a48c-8ea2d31460fd/ouya-image20170911-3-v6tjz1",
  "premium": false,
  "promotedProduct": {
    "identifier": "FullGameBombSquad",
    "name": "BombSquad Pro",
    "localPrice": 4.99,
    "originalPrice": 4.99,
    "percentOff": 0,
    "currency": "USD",
    "description": "Doubles tickets earned in-game, gives a power-ranking bonus, and more..",
    "type": "entitlement"
  },
  "inAppPurchases": true,
  "rating": {
    "count": 3706,
    "average": 4.36
  },
  "developer": {
    "name": "Eric Froemling",
    "founder": false
  },
  "suggestedAge": "9+",
  "apk": {
    "fileSize": 58535084,
    "nativeSize": 9511196,
    "publicSize": 571122,
    "md5sum": "54d5d03855add2b824040e39a9380f48",
    "filename": "1zbYKRSS1elKIYI9eseH_BombSquad-ouya-release.apk",
    "errors": "",
    "package": "net.froemling.bombsquad",
    "versionCode": 14304,
    "state": "complete"
  },
  "firstPublishedAt": 1367356207,
  "version": {
    "number": "1.4.123",
    "publishedAt": 1506379060,
    "uuid": "3ae8fc67-f7f5-4f97-a48c-8ea2d31460fd"
  },
  "metaData": [
    "key:rating.average",
    "key:developer.name",
    "key:suggestedAge",
    "56.12 MiB"
  ],
  "tileImage": "https://d3e4aumcqn8cw3.cloudfront.net/api/file/0xrPYAcTUCYpjTUPbqSV",
  "ccUrl": null,
  "gamerNumbers": [
    1,
    2,
    3,
    4
  ],
  "genres": [
    "Fight!",
    "Multiplayer",
    "Sports"
  ]
}

Example: Bundle

{
  "bundle": {
    "apps": [
      {
        "gamerNumbers": [
          1
        ],
        "genres": [
          "Adventure",
          "Kids List",
          "Puzzle/Trivia"
        ],
        "url": "ouya://launcher/details?app=com.GoldenTricycle.Clark",
        "latestVersion": {
          "apk": {
            "md5sum": "a674b6c205502d9b4a907ade90307ba0"
          },
          "versionNumber": "1.24",
          "uuid": "7230ac05-d24c-4347-a990-7ac283c17063"
        },
        "inAppPurchases": true,
        "promotedProduct": {
          "type": "entitlement",
          "developerName": "GoldenTricycle / Hahn Film AG",
          "identifier": "clark_full_license_test",
          "name": "Clarc Full Version",
          "localPrice": 3.99,
          "originalPrice": 3.99,
          "percentOff": 0,
          "currency": "USD",
          "description": "This item unlocks the full game with 25 levels, more than 100 puzzles and more than 10 hours of gameplay."
        },
        "premium": false,
        "type": "app",
        "package": "com.GoldenTricycle.Clark",
        "updated_at": 1384854785,
        "updatedAt": "2013-11-19T09:53:05Z",
        "title": "CLARC",
        "image": "https://www.filepicker.io/api/file/VzCsgc3BTx2RiGpTr4Uw",
        "contentRating": "Everyone",
        "rating": {
          "count": 716,
          "average": 4.25
        }
      },
      {
        "gamerNumbers": [
          1
        ],
        [...]
      }
    ],
    "currency": "EUR",
    "price": 6.99,
    "contentRating": "9+",
    "purchased": false,
    "games": [
      "com.GoldenTricycle.Clark",
      "com.Tripleslash.MagneticByNature",
      "com.Thinice.TwinRobots",
      "com.scaryrobot.badbadbots"
    ],
    "purchaseUrl": "ouya://launcher/purchase?developer=ec1a9ccd-373f-4047-bd07-36466ab7e25d&product=ROBOBUNDLE"
  },
  "buttons": [],
  "apps": [],
  "muted": true,
  "metaData": [
    "Golden Tricycle",
    "Team Tripleslash",
    "Scary Robot",
    "Thinice"
  ],
  "mediaTiles": [
    {
      "url": "https://vimeo.com/84689664",
      "type": "video"
    },
    {
      "urls": {
        "thumbnail": "https://s3.amazonaws.com/ouya-screenshots/be239ca4-10fd-42dd-89cd-1806e80b1362/thumbnails/thumbnail20150202-3-6hikjv.jpeg",
        "full": "https://s3.amazonaws.com/ouya-screenshots/be239ca4-10fd-42dd-89cd-1806e80b1362/oivu9a_RackMultipart20150202-15-1sg3fmt"
      },
      "type": "image"
    }
  ],
  "description": "CLARC, Magnetic By Nature\r\n\r\nAbout CLARC\r\n",
  "title": "ROBO GAME BUNDLE!"
}

A full version of that response data is available in git at api/devs.ouya.tv/api-v1-details.response-bundle-full.json

Example: Unlisted game

{
  "error": {
    "message": "Unknown application",
    "code": 2005
  }
}

Buttons

It is possible to add buttons in each of the detail types.

There are two types of buttons:

Button for a detail page of an app

{
    "type": "Game",
    "title": "Bloo Kid 2",
    "buttons": [
        {
            "bold": false,
            "url": "ouya://launcher/details?app=de.eiswuxe.blookid2_unlocked",
            "text": "Show unlocked"
        }
    ],
    ...
}

Button for a website URL

{
    "type": "Game",
    "title": "Bloo Kid 2",
    "buttons": [
        {
            "bold": false,
            "url": "http://cweiske.de/",
            "text": "Open developer page"
        }
    ],
    ...
}

Switchable button

{
    "type": "Game",
    "title": "Bloo Kid 2",
    "buttons": [
        {
            "bold": false,
            "status_url": "http://example.org/activation-status",
            "url": "http://example.org/activate",
            "off_url": "http://example.org/deactivate",
            "text": "Activate feature",
            "on_text": "Deactivate feature"
        }
    ],
    ...
}

When the details page is loaded, status_url is fetched. It needs to return {"status":true} or {"status":false}.

If "true" is returned, on_text is shown. Clicking will launch off_url.

If "false is returned, text is shown. Clicking will launch url.

GET https://devs.ouya.tv/api/v1/developers/xxx/current_gamer

Fetch gamer information from within a game.

Usage

HTTP request

Protocol

https

Method

GET

Host

devs.ouya.tv

Path

/api/v1/developers/xxx/current_gamer

xxx

Developer UUID

Headers

Standard headers

GET parameters
auth_token

Same data as in standard header X-OUYA-AuthToken

HTTP response

Status code

200 OK

Content-type

application/json; charset=utf-8

Same data as in gamers/me.

Example

{
    "gamer": {
        "username": "cwdev3",
        "uuid": "0a6f5fc0-bf9b-42b2-a4d0-69f2c8e4d5da"
    }
}

GET https://devs.ouya.tv/api/v1/developers/xxx/products/

Use in-game when purchasing a feature, sometimes already at game startup.

Some games rely on this to check if the game is purchasable at all. If the product list does not contain the product identifier they expect, buying is not possible. (Example: com.sega.sonic4epi)

Usage

HTTP request

Protocol

https

Method

GET

Host

devs.ouya.tv

Path

/api/v1/developers/xxx/products/

xxx

Developer UUID

Example: /api/v1/developers/c4e46efe-05fd-4be9-9d7e-1f7607eabd49/products/

Headers

Standard headers

GET parameters
auth_token

Same as X-OUYA-AuthToken

only

Product key (same as Identifier in promotedProduct of app details)

Example: &only=unlock_pro

HTTP response

Status code

200 OK

Content-type

application/json; charset=utf-8

Example

{
  "developerName": "AppBarbecue Inc.",
  "currency": "USD",
  "products": [
    {
      "type": "entitlement",
      "description": "Instantly unlock full game with all Pro Levels. The challenging puzzles will take days to solve. Explore Assyria, Hanging Gardens & more. ",
      "percentOff": 0,
      "originalPrice": 4.99,
      "localPrice": 4.99,
      "priceInCents": 499,
      "name": "Unlock All Pro Levels",
      "identifier": "unlock_pro"
    }
  ]
}

GET https://devs.ouya.tv/api/v1/discover

Fetch the categories and games in the OUYA store.

HTTP request

Protocol

https

Method

GET

Host

devs.ouya.tv

Path

/api/v1/discover

Headers

Standard headers

GET parameters
auth_token

Same as X-OUYA-AuthToken

HTTP response

Status code

200 OK

Content-type

application/json; charset=utf-8

Response body definition

JSON object with two properties: rows and tiles. rows contains the layout of the "discover" store main view, while tiles contains the list of games/apps available in the store with details.

rows

Array with objects that have with several properties:

showPrice

true or false

ranked

true or false

If the games are sorted by the internal ranking factor, or in order of appearance in tiles.

tiles

array

List of integer game IDs ([0, 1, 2])

title

string

Title of the category

tiles

Array of objects that each describe a single application.

The position in the tiles array is the ID used by rows/tiles.

bundle

Only there when it's not a single game but a bundle of games that can be bought.

Object with the following properties:

apps

array

Array of package strings

currency

EUR

price

float

contentRating

See contentRating description below.

purchaseUrl

string

URL where to initiate buying the bundle

ouya://launcher/purchase?developer=ec1a9ccd-373f-4047-bd07-36466ab7e25d&product=ROBOBUNDLE

contentRating

For which audiences the game is meant

Seen values:

  • Everyone

  • 9+

  • 12+

  • 17+

gamerNumbers

array

List of integers describing how many players can play the game

genres

array

Array of strings with genre titles.

["Fight!", "Multiplayer", "Platformer"]

Known genres:

  • Adventure

  • App

  • Arcade/Pinball

  • Card/Casino

  • Dual Stick

  • Entertainment

  • Fight!

  • FPS/Shooter

  • Kids List

  • Meditative

  • Multiplayer

  • Music

  • Platformer

  • Puzzle/Trivia

  • Racing

  • Retro

  • Role-Playing

  • Short on Time?

  • Sim/Strategy

  • Sports

  • Utility

  • Video

image

URL to an image displayed in store view.

Size should be 732x412.

.jpg and .png files work.

inAppPurchases

true or false

If you can/have to pay within the game

latestVersion

object

apk
md5sum

MD5 hash of the apk file. Used for verification after download.

versionNumber

string with current version, e.g. 1.11

uuid

UUID of the release.

package

string

java package name prefix, e.g. evil.corptron.DuckGame

premium

true or false

When true, the game has no demo version and has to be bought before it can be downloaded.

promotedProduct

object

Bundles do not have this property set.

The "buy" button buys this product.

currency

string

EUR

description

string

developerName

string

Name of the developer or company who made the game

identifier

string

???

localPrice

float

Current price

name

string

Title of the game

originalPrice

float

Price it did once cost

percentOff

integer

Percent difference between originalPrice and localPrice

type

string

entitlement is the only type seen within promotedProduct.

rating

Object with two properties: count and average.

count

integer

Number of votes for this game

average

float

Average rating (1-5)

title

Name of the app/game

type

app or discover or details_page

Bundles always have details_page.

updated_at

integer

Unix timestamp of last update date

updatedAt

string

ISO 8601-date, e.g. 2014-12-04T22:16:30Z

url

string

URL for the game details page

Game details

ouya://launcher/details?app=evil.corptron.DuckGame

Bundle details

ouya://launcher/details?page=be239ca4-10fd-42dd-89cd-1806e80b1362

See GET https://devs.ouya.tv/api/v1/details.

title

string

Always DISCOVER.

Example

{
  "rows": [
    {
      "showPrice": true,
      "ranked": true,
      "tiles": [ 0, 1, 2, 3 ],
      "title": "TRENDING NOW"
    },
    {
      "showPrice": true,
      "ranked": false,
      "tiles": [ 94, 95, 96 ],
      "title": "NEW RELEASES"
    },
    {
      "showPrice": true,
      "ranked": false,
      "tiles": [ 94, 62 ],
      "title": "OUR FOUNDERS"
    }
  ],
  "tiles": [
    {
      "gamerNumbers": [
        1
      ],
      "genres": [
        "Fight!",
        "Multiplayer",
        "Platformer",
        "Retro",
        "Sports"
      ],
      "url": "ouya://launcher/details?app=evil.corptron.DuckGame",
      "latestVersion": {
        "apk": {
          "md5sum": "ac4e1ddefe383f8314fe5914edcf8705"
        },
        "versionNumber": "1.11",
        "uuid": "7cbd8b8b-e9df-4c30-9e0f-5a777c5e4eb4"
      },
      "inAppPurchases": true,
      "promotedProduct": {
        "type": "entitlement",
        "developerName": "Landon Podbielski",
        "identifier": "DUCKGAME",
        "name": "Duck Game",
        "localPrice": 8.99,
        "originalPrice": 8.99,
        "percentOff": 0,
        "currency": "EUR",
        "description": "You are buying Duck Game you lucky person. "
      },
      "premium": false,
      "type": "app",
      "package": "evil.corptron.DuckGame",
      "updated_at": 1417731390,
      "updatedAt": "2014-12-04T22:16:30Z",
      "title": "DUCK GAME",
      "image": "https://www.filepicker.io/api/file/iESEZs3fSUafrXuNpagi",
      "contentRating": "Everyone",
      "rating": {
        "count": 1155,
        "average": 4.31
      }
    },
    {
      "gamerNumbers": [
        1,
        2
      ],
      "genres": [
        "Adventure",
        "Arcade/Pinball",
        "Dual Stick",
        "FPS/Shooter",
        "Fight!",
        "Kids List",
        "Multiplayer",
        "Racing",
        "Short on Time?"
      ],
      "url": "ouya://launcher/details?app=com.media.playcast.OUYA.BAA",
      "latestVersion": {
        "apk": {
          "md5sum": "39931a3179e6c984771f0f1f49b59e87"
        },
        "versionNumber": "1.6.35707.8",
        "uuid": "abe8eeb3-4fd9-45bb-ba6b-50eb9d60478b"
      },
      "inAppPurchases": true,
      "promotedProduct": null,
      "premium": false,
      "type": "app",
      "package": "com.media.playcast.OUYA.BAA",
      "updated_at": 1433234808,
      "updatedAt": "2015-06-02T08:46:48Z",
      "title": "GameFly Packful Of Fun",
      "image": "https://www.filepicker.io/api/file/05y2T8cKTY6cUfX7RYFR",
      "contentRating": "17+",
      "rating": {
        "count": 394,
        "average": 4.09
      }
    },
    {
      "url": "ouya://launcher/details?page=08db29bd-c2f0-41d7-9e5d-d842f1bf34d2",
      "image": "https://s3.amazonaws.com/ouya-screenshots/08db29bd-c2f0-41d7-9e5d-d842f1bf34d2/thumbnails/thumbnail20150512-3-1gigg1x.jpeg",
      "uuid": "08db29bd-c2f0-41d7-9e5d-d842f1bf34d2",
      "title": "OUYA PRESENTS: JOE DANGER",
      "type": "details_page"
    },
    {
      "url": "ouya://launcher/details?page=3bdbe05a-201f-40c0-bb58-5aa4d6ea79dc",
      "image": "https://s3.amazonaws.com/ouya-screenshots/3bdbe05a-201f-40c0-bb58-5aa4d6ea79dc/thumbnails/thumbnail20150220-3-1p5bhh7.jpeg",
      "uuid": "3bdbe05a-201f-40c0-bb58-5aa4d6ea79dc",
      "title": "OUYA PRESENTS: THE JACKBOX PARTY PACK",
      "type": "details_page"
    },
    {
      "url": "ouya://launcher/discover/Adventure",
      "image": "",
      "title": "Adventure",
      "type": "discover"
    },
  ],
  "title": "DISCOVER"
}

The API git repository contains a full copy of the "discover" response at api/devs.ouya.tv/api-v1-discover.response-full.json.

GET https://devs.ouya.tv/api/v1/discover/home

Probably the list of games to be featured on the main menu.

More than the 4 displayed because it could be that a player already bought some of them - they would not be shown then.

HTTP request

Protocol

https

Method

GET

Host

devs.ouya.tv

Path

/api/v1/discover/home

Headers

Standard headers

GET parameters
auth_token

Same as X-OUYA-AuthToken

HTTP response

Status code

200 OK

Content-type

application/json; charset=utf-8

Response body definition

Same as GET https://devs.ouya.tv/api/v1/discover with some limitations:

  • Only one entry in the rows array

    Title of this row is FEATURED, price is shown, not ranked.

  • title attribute value is home.

GET https://devs.ouya.tv/api/v1/discover/tutorials

Loaded then the user enters the "develop" menu.

FIXME

POST https://devs.ouya.tv/api/v1/events

Send information about the last events on the OUYA console to the logging/tracking server.

Usage

  1. Every now and then when enough events have been collected

    FIXME: determine exact behavior

HTTP request

Protocol

https

Method

POST

Host

devs.ouya.tv

Path

/api/v1/events

Headers

Standard headers

Content-Type

application/x-www-form-urlencoded

POST parameters
current_time

1434577856574

Unix timestamp, milliseconds.

console_id

Same data as in standard header X-OUYA-Console-Id

events

JSON-encoded array of event objects

auth_token

Same data as in standard header X-OUYA-AuthToken

Example event JSON data:

[
    {
        "data": "num_connected_controllers=1 controller_names=\"OUYA Game Controller\" controller_versions=\"104\"",
        "timestamp": 1434577827864,
        "name": "connected_controllers",
        "uuid": "47ebb367-ce5f-4249-88f1-312bfac9efa2"
    },
    {
        "data": "num_apps_sideloaded=0 sideloaded_packages=none",
        "timestamp": 1434577827849,
        "name": "sideloaded_apps",
        "uuid": "7ab19279-0308-4a65-93d2-bc83f3bc518b"
    },
    {
        "data": "hardware_version=0 ouya_version=1.2.1427_r1 system_language=eng age_gate=null pin_code=false num_apps_ouya=0 num_apps_sideloaded=0 num_buried_packages=0 hd_space_used=0 hd_space_free=0 mem_free=436621312 mem_total=1018093568 tv_resolution=1920x1080 network_device=ethernet adb_enabled=true",
        "timestamp": 1434577827834,
        "name": "console_snapshot",
        "uuid": "308b7829-a357-4d0d-a79b-2456c40dc678"
    },
    {
        "data": "app_session_uuid=a963561b-a6e8-49f5-bcfa-218bc5a1d6c8 app_session_ouya_uuid=e0eef5de-624c-42f8-9b1b-a0968a27eb03 app_session_package=tv.ouya.oobe app_session_current_activity=tv.ouya.console.launcher.agreements.AgreementsActivity app_session_start_tick=37 app_session_current_tick=605 app_session_active_ticks=568 app_session_last_analog_tick=597 app_session_last_digital_tick=32",
        "timestamp": 1434577800458,
        "name": "app_session_update",
        "uuid": "161d3457-4469-42e3-bbc5-4c8e4a45743f"
    },
    {
        "data": "app_session_uuid=a963561b-a6e8-49f5-bcfa-218bc5a1d6c8 app_session_ouya_uuid=e0eef5de-624c-42f8-9b1b-a0968a27eb03 app_session_package=tv.ouya.oobe app_session_current_activity=tv.ouya.console.launcher.agreements.AgreementsActivity app_session_start_tick=37 app_session_current_tick=605 app_session_active_ticks=568 app_session_last_analog_tick=597 app_session_last_digital_tick=32",
        "timestamp": 1434577800331,
        "name": "app_session_update",
        "uuid": "ce209f8e-c564-4264-afdd-9e139b4d99fd"

HTTP response

Status code

200 OK

Content type

application/json; charset=utf-8

Body

{}

POST https://devs.ouya.tv/api/v1/gamers

Register a new user and/or verify new user registration data.

This method is both used as verification during input, as well as the final registration.

Usage

  1. During registration to check if data are valid

  2. During registration to finish new user sign up and create the account

HTTP request

Protocol

https

Method

GET

Host

devs.ouya.tv

Path

/api/v1/gamers

Headers

Standard headers except token parameters.

Content-Type

application/x-www-form-urlencoded

POST parameters
gamer[username]

User name used to log in

gamer[password]

User password

gamer[password_confirmation]

User password, a second time

gamer[email]

User e-mail address for marketing e-mails

gamer[gender]

unknown | male | female

gamer[email_opt_out]

false | true

Opt out from marketing e-mails

dryrun

true

If set, the user data are not registered - only verified. The response then tells which fields are deemed invalid.

Not set when the user clicks "register".

HTTP response

..note:: Does not support HTTP redirects!

Success

When everything is ok and the user has been registered (or the data were valid when dryrun was set)

Status code

200 OK

Content type

application/json; charset=utf-8

Response body

{}

Validation error

When some of the data are deemed to be invalid.

Status code

400 Bad Request

Content type

application/json; charset=utf-8

Example:

{
  "error": {
    "data": {
      "username": [
        "can't be blank",
        "is too short (minimum is 3 characters)",
        "is invalid"
      ],
      "password": [
        "can't be blank",
        "cannot contain username"
      ]
    },
    "message": "Validation errors occurred",
    "code": 2006
  }
}

PUT https://devs.ouya.tv/api/v1/gamers/key

Store the user's public key on the server.

Receipts/purchases are encryptd by the server with the user's public key, so that only that user can decrypt it.

Usage

  1. Once per bootup just before purchases are checked the first time. That can be when opening "Play" that contains purchasable games, or "Discover" showing purchasable games.

HTTP request

Protocol

https

Method

PUT

Host

devs.ouya.tv

Path

/api/v1/gamers/key

Headers

Standard headers

Content-Type

application/x-www-form-urlencoded

GET parameters
auth_token

Same data as in standard header X-OUYA-AuthToken

POST parameters
auth_token

Same data as in standard header X-OUYA-AuthToken

gamer[key]

string

FIXME encryption key

gamer[password]

string

User account password

gamer[username]

string

User account name

Example key:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvf3MvvZui5shNGbt2O0zveXrtfHZNivowNKiO
UagJARKCJmjOJVtZ1srCe95Eul/xBDPDEaH8vJetn5Pl99QwhdYL1ps9mUhmocx90LavQsipr2Dw
B7XshwN/EpW0uR/R84a3yXozpk7dgXi4+y//A+XT+MqgxsY6cdSGrBMsCQIDAQAB
-----END PUBLIC KEY-----

HTTP response

Status code

201 Created

Content type

application/json; charset=utf-8

Body

{}

GET https://devs.ouya.tv/api/v1/gamers/me

Fetch username, e-mail and other data about the user currently logged in.

HTTP request

Protocol

https

Method

GET

Host

devs.ouya.tv

Path

/api/v1/gamers/me

Headers

Standard headers

GET parameters
auth_token

Same data as in standard header X-OUYA-AuthToken

HTTP response

Status code

200 OK

Content type

application/json; charset=utf-8

Example:

{
  "gamer": {
    "uuid": "0a6f5fc0-bf9b-42b2-a4d0-69f2c8e4d5da",
    "settings": {},
    "founder": false,
    "email": "cwdev3@example.org",
    "username": "cwdev3"
  }
}

GET https://devs.ouya.tv/api/v1/gamers/me/agreements

Check which legal agreements have been confirmed by the user, and if there are updates that have to be confirmed.

HTTP request

Protocol

https

Method

GET

Host

devs.ouya.tv

Path

/api/v1/gamers/me/agreements

Headers

Standard headers

GET parameters
auth_token

Same data as in standard header X-OUYA-AuthToken

HTTP response

Status code

200 OK

Content type

application/json; charset=utf-8

Example:

{
  "marketplace_required_version": 2,
  "marketplace": 0,
  "privacy_required_version": 0,
  "privacy": 0
}

Each agreement has an associated HTML file with the same name at https://devs.ouya.tv/agreements/, e.g. https://devs.ouya.tv/agreements/marketplace.html for the marketplace agreement.

PUT https://devs.ouya.tv/api/v1/gamers/me/agreements

Store that a legal agreement has been confirmed by the user.

Usage

  1. After setting up a factory-reset OUYA.

  2. After logging in with an existing account.

  3. After booting up the OUYA.

HTTP request

Protocol

https

Method

PUT

Host

devs.ouya.tv

Path

/api/v1/gamers/me/agreements

Headers

Standard headers

Content-Type

application/x-www-form-urlencoded

GET parameters
auth_token

Same data as in standard header X-OUYA-AuthToken

POST parameters
marketplace:

2

Version of the marketplace agreement

auth_token:

Same data as in standard header X-OUYA-AuthToken

HTTP response

Status code

200 OK

Content type

application/json; charset=utf-8

Body

{}

GET https://devs.ouya.tv/api/v1/gamers/me/apps/developed

Loaded then the user enters the "develop" menu and activates the "builds" menu item.

FIXME

POST https://devs.ouya.tv/api/v1/gamers/me/consoles

Associate a console ID with the account.

Usage

  1. After logging in with an existing account

  2. (Probably after registering a new account)

HTTP request

Protocol

https

Method

POST

Host

devs.ouya.tv

Path

/api/v1/gamers/me/consoles

Headers

Standard headers

Content-Type

application/x-www-form-urlencoded

GET parameters
auth_token

Same data as in standard header X-OUYA-AuthToken

POST parameters
console_id:

015d4b33bc64141b

Same data as in standard header X-OUYA-Console-Id

auth_token:

Same data as in standard header X-OUYA-AuthToken

HTTP response

Status code

200 OK

Content type

application/json; charset=utf-8

Body

{}

GET https://devs.ouya.tv/api/v1/gamers/me/user_messages

Send messages to users.

The API returns a list of URLs that get displayed to the user in a popup in the main menu.

HTTP request

Protocol

https

Method

GET

Host

devs.ouya.tv

Path

/api/v1/gamers/me/user_messages

Headers

Standard headers

GET parameters
auth_token

Same as X-OUYA-AuthToken

HTTP response

Status code

200 OK

Content-type

application/json; charset=utf-8

Example (empty):

{
    "messages": [
        null
    ]
}

Example (one URL):

{
    "messages": [
        "https://www.ouya.tv/message_to_all_users.txt"
    ]
}

GET https://devs.ouya.tv/api/v1/games/xxx/purchases

Check which features have been bought in an app (if the app has been bought).

Each game may have multiple products that can be bought. One of them may be the "promotedProduct" in the discover section, and that one can be bought in the discover store / play menu app details.

Usage

HTTP request

Protocol

https

Method

GET

Host

devs.ouya.tv

Path

/api/v1/games/xxx/purchases

xxx

app package name

Example: /api/v1/games/com.ChrisChung.CatlateralDamage/purchases

Headers

Standard headers

GET parameters
auth_token

Same as X-OUYA-AuthToken

app_id

com.ChrisChung.CatlateralDamage

Same as the one in the path.

user_agent

launcher

HTTP response

Status code

200 OK

Content-type

application/json; charset=utf-8

The response is a JSON objec containing three properties:

iv

Base 64 encoded initialization vector for encryption

key

Base 64 encoded FIXME. Must be 128/192/256 bits long.

blob

Base64 encoded encrypted data

The decrypted blob contains again a JSON object with three properties:

This blob is again base64-encoded JSON and contains the actual data: A JSON with a single property "purchases" whose value is an array of receipts/purchases.

Each receipt has the following properties:

purchaseDate

Required. Milliseconds.

generateDate

Optional. Milliseconds.

identifier

Product key. Required. Alternative name: sku.

gamer

User UUID. Required.

uuid

Transaction UUID. Required.

priceInCents

Integer. Required.

localPrice

Float. Optional.

currency

Optional. Default USD.

Example

Encrypted response:

{
  "blob": "0F/7D3gtCgLNJ6pZsy8M5LOLMlNsKPouBlY2VvYeTSF+k5LZQR0Otbp8vZXV\nS8Ad/hlQAuqrVgnLYEO1gxadfWQnQE1ZEoOnGcxBiNL2svOftt1uonvyTqBt\nKz5qLrd2oNI8V65dX+0ydZ7IwT5TOglC4B/YHKjA32GYNaw7GaNMmu3zJVfF\nJblVT4bZDOeyxTLanp3Fan7fZ6AkMlWy81T5RMf9vB/PBkUWlpIUZeUToXBT\n6HSRV1Ke4kfkyvmY2WisxJ0dApkcgS+bdbWhH7JsdMTT+zwUISxav5iJLkVt\n1fA1g5WN8NwVzb2OKPZcAQm1d/TnsqUnMQBfDAFaji7ADZ0Ukd0xxsirYQTW\nWpNJbFVtAJpkLNjEqVSVWqr0\n",
  "iv": "t3jir1LHpICunvhlM76edQ==\n",
  "key": "CqREllniR2CZsTdqGlSHq+b1n/ludDCPV8AAaR3aF4va8lckIRONsvQmndJS\niccb/UeYHXQOf2o06/oR8rGJvrAf598K7a7QQSSY1u6Btd8op/nOzCn+F7Q5\n4tqu7qvlVRrIMDIQtms/SfQTE2XEyKvEQVm2N/PhbdjXmXmgJHU=\n"
}

Decrypted receipt list:

{
    "purchases": [
        {
            "purchaseDate": 1576845859000,
            "generateDate": 1576845859000,
            "identifier": "blookid2_full",
            "gamer": "00702342-0000-1111-2222-c3e1500cafe2",
            "uuid": "0dc813a0-37d5-11ea-9ea4-075f44abe85b",
            "priceInCents": 399,
            "localPrice": 3.99,
            "currency": "EUR"
        }
    ]
}

POST https://devs.ouya.tv/api/v1/games/xxx/purchases

Buy a game.

After buying the game shows up in GET https://devs.ouya.tv/api/v1/premium_purchases.

Usage

HTTP request

Protocol

https

Method

POST

Host

devs.ouya.tv

Path

/api/v1/games/xxx/purchases

xxx

app package name

Example: /api/v1/games/com.ChrisChung.CatlateralDamage/purchases

Headers

Standard headers

Content-Type

application/x-www-form-urlencoded

GET parameters
auth_token

Same as X-OUYA-AuthToken

user_agent

launcher (at least when bought through the OUYA UI)

POST parameters
blob

Base64-encoded encrypted data

iv

Base64-encoded initialization vector for the cryptographic function

key

Base64-encoded key used to encrypt the blob. Encrypted with FIXME: gamer key or developer key.

auth_token

Same as X-OUYA-AuthToken

The decrypted blob again contains blob, key and iv.

The decrypted inner blob contains a JSON object:

identifier

Product key

testing

Unknown. Always "true".

uuid

Random number that is used by the game for this purchase request. Must be returned in the response to this request.

Raw request (without encryption):

blob=eyAia2V5IiA6ICJHcnl0dnRSYjY5TDh6L3pIT3RTdGFnPT0iLCAiaXYiIDogIjZzMDd3OGo3VFNleVhQdzBsMXdvRUE9PSIsICJibG9iIiA6ICJleUpwWkdWdWRHbG1hV1Z5SWpvaVoyOWlYMloxYkd4ZloyRnRaVjkxYm14dlkyc2lMQ0owWlhOMGFXNW5Jam9pZEhKMVpTSXNJblYxYVdRaU9pSTNOak0xTjJFME9XRm1NVFk0WWpJNUluMD0iIH0%3D&iv=QHpnmyEf7BGZhTnK37NggQ%3D%3D&key=bdR0jZ22clKqJwOsyYdn8w%3D%3D&auth_token=00702342-0000-1111-2222-c3e1500cafe1

Decrypted:

{
    "identifier":"SONIC4EP1FULL_001",
    "testing":"true",
    "uuid":"2ba72281837f0df3"
}

HTTP response

Status code

200 OK

Content-type

application/json; charset=utf-8

Again the base-64 encoded keys: iv, key and blob.

blob is a JSON object that needs to contain the uuid property. Most games do not want any other properties.

"God of Blades" requires:

Example

{
  "blob": "YKNolqKuaDcQnqQH8yncS+0hVl/YnajMgnojfMaO2IzUpfVg4lBVrz5NF30N\nXUkgpBTnXdcPUalv7YvWsqT9b8Tdm5PYgoduqi2zLyXF+bSWY+bBigDX+MDG\nyvgxjfpYcWeyYaNLn2vhsj0rVNVorT5CggAXrry2eeUIFOX+9IUzbHmxfiqP\nlglVtrudwzQO1PS5n3KNJnHfp+r7vgBG5DzErUK4YHUYBe4/9li313tEIwnK\nX4kDZXSzKiZ2SPfyYTaVgIr82x9GDaIa1ZXIBuFlQSUo55A5Gy7Wy9rTDzMb\n80LdsNlbHeOiSIBN7Rj7CuOu7Uz5btuWLCpmCHZ2xgyhN6I9y2/KTNYa2JIA\n/9fsBGcrdkiu4f3aKdiZlI8bh07npp10KpQEMszz59xr5V6h0Xjjcgw95SaE\nDmxxz3LSRVtNpjGsTlqsb4Jnc/fKcMrJcmzoDLAodfgnSev8hrNUmgs6f/df\neXKQ0J6JuiWAgKXUZ9g5GEkUn0uIo3RzIyVqRIJL9zM6oeaZ487zG1X2e5Xy\noCc1x6GKQpGr9Qp+hRp6HSp8NUyR2ZziD+DSHbZeDaZdu3bbWrzIDEVJLpwU\noVROZR2nqyR9i3eQlpvSJGUPBM9pi8KdYTvOuBKB9hrz1XYe8852bFsbn0G/\np8nmKKPM0xDc0gHuScLfUZQ=\n",
  "iv": "wV8mnhuGz7YaxNSP1QWfVQ==\n",
  "key": "hxvgGjQWJJ8vSidCF5eP4JC1VqUjZxL+ZLq9p6BrbuhSMqvtFU/YZxinKTeD\nMkCnK3Ie0lP8OoKGFl21F+/5rOuybD+FKfVJdXwIsA1ryjkFi8KBMq2G+YWo\nxMM9T0zdkOKiidK1GYHqJyLlVLrEC+qaLSqSPEoL9R0ovZhy64c=\n"
}

GET https://devs.ouya.tv/api/v1/premium_purchases

Get a list of all games that have been bought.

HTTP request

Protocol

https

Method

GET

Host

devs.ouya.tv

Path

/api/v1/premium_purchases

Headers

Standard headers

GET parameters
auth_token

Same as X-OUYA-AuthToken

HTTP response

Status code

200 OK

Content-type

application/json; charset=utf-8

Full details of the apps.

Example

{
  "games": [
    {
      "gamerNumbers": [
        1,
        2,
        3,
        4
      ],
      "genres": [
        "Fight!",
        "Multiplayer",
        "Sports"
      ],
      "url": "ouya://launcher/details?app=net.froemling.bombsquad",
      "latestVersion": {
        "apk": {
          "md5sum": "e1a734acba287777da24fe5eaf8101c0"
        },
        "versionNumber": "1.4.17",
        "uuid": "b1396eb2-6b3f-4ccd-82f8-fadc05094931"
      },
      "inAppPurchases": true,
      "promotedProduct": {
        "type": "entitlement",
        "developerName": "Eric Froemling",
        "identifier": "FullGameBombSquad",
        "name": "BombSquad Pro",
        "localPrice": 4.99,
        "originalPrice": 4.99,
        "percentOff": 0,
        "currency": "USD",
        "description": "Doubles tickets earned in-game, gives a power-ranking bonus, and more.."
      },
      "premium": false,
      "type": "app",
      "package": "net.froemling.bombsquad",
      "updated_at": 1431712678,
      "updatedAt": "2015-05-15T17:57:58Z",
      "title": "BombSquad",
      "image": "https://www.filepicker.io/api/file/AObi2TITPGH2bKTbSvLt",
      "contentRating": "9+",
      "rating": {
        "count": 3057,
        "average": 4.42
      }
    },
    {
      "gamerNumbers": [
        1
      ],
      "genres": [
        "Kids List",
        "Multiplayer",
        "Sports"
      ],
      "url": "ouya://launcher/details?app=net.mountainsheep.icerage",
      "latestVersion": {
        "apk": {
          "md5sum": null
        },
        "versionNumber": "1.8",
        "uuid": "9ba50e67-1bb7-4ac3-8d01-36fbc8ae2566"
      },
      "inAppPurchases": true,
      "promotedProduct": {
        "type": "entitlement",
        "developerName": "Mountain Sheep, Inc.",
        "identifier": "ICE_RAGE_UNLOCK_FULL_GAME",
        "name": "Unlock Full Game",
        "localPrice": 2.99,
        "originalPrice": 2.99,
        "percentOff": 0,
        "currency": "USD",
        "description": ""
      },
      "premium": false,
      "type": "app",
      "package": "net.mountainsheep.icerage",
      "updated_at": 1381227272,
      "updatedAt": "2013-10-08T10:14:32Z",
      "title": "Ice Rage",
      "image": "https://www.filepicker.io/api/file/JLXK36xeSLCg1Faqw67Q",
      "contentRating": "Everyone",
      "rating": {
        "count": 1595,
        "average": 4.15
      }
    }
  ]
}

GET https://devs.ouya.tv/api/v1/queued_downloads

Fetch a list of apps/games that shall get installed automatically on the OUYA.

The OUYA checks the download queue exactly every 5 minutes.

More information: http://cweiske.de/tagebuch/push-to-ouya.htm

HTTP request

Protocol

https

Method

GET

Host

devs.ouya.tv

Path

/api/v1/queued_downloads

Headers

Standard headers

GET parameters
auth_token

Same as X-OUYA-AuthToken

HTTP response

Status code

200 OK

Content-type

application/json; charset=utf-8

Known source options:

gamer

The user clicked onto "push to my ouya" on the OUYA website

game-of-the-month

The game gets automatically installed because the OUYA people awarded it the "game of the month" trophy.

new-user

You are a freshly registered user and should have this game on your OUYA.

Example

Automatically pushed onto a fresh account:

{
  "queue": [
    {
      "versionUuid": "",
      "title": "Tetris Battle Fusion",
      "source": "new-user",
      "uuid": "com.toa.tetrisFusionOuya"
    },
    {
      "versionUuid": "",
      "title": "BombSquad",
      "source": "new-user",
      "uuid": "net.froemling.bombsquad"
    }
  ]
}

Manually pushed via the web site:

{
  "queue": [
    {
      "versionUuid": "",
      "title": "Sonic The Hedgehog 4 Episode I",
      "source": "gamer",
      "uuid": "com.sega.sonic4epi"
    }
  ]
}

DELETE https://devs.ouya.tv/api/v1/queued_downloads/xxx

Remove an app from the list of queued downloads.

Usage

After the app has been installed automatically on the OUYA.

HTTP request

Protocol

https

Method

DELETE

Host

devs.ouya.tv

Path

/api/v1/queued_downloads/xxx

xxx

Package name. The uuid value from the queued downloads list.

Example: /api/v1/queued_downloads/net.froemling.bombsquad

Headers

Standard headers

uuid

The uuid value from the queued downloads list, which is actually a package name and not an UUID.

Same as the xxx in the path.

GET parameters
auth_token

Same as X-OUYA-AuthToken

HTTP response

Status code

204 No Content

GET https://devs.ouya.tv/api/v1/ratings

Get a list of games and the ratings the user made for them.

HTTP request

Protocol

https

Method

GET

Host

devs.ouya.tv

Path

/api/v1/ratings

Headers

Standard headers

GET parameters
auth_token

Same as X-OUYA-AuthToken

HTTP response

Status code

200 OK

Content-type

application/json; charset=utf-8

Example

{
  "ratings": [
    {
      "score": 4,
      "game": "com.grahamweldon.games.puzzle2048"
    },
    {
      "score": 2,
      "game": "com.baKno.Motorbike"
    },
    {
      "score": 4,
      "game": "org.jfedor.frozenbubble"
    }
  ]
}

POST https://devs.ouya.tv/api/v1/ratings

Store the rating of a single game

Usage

Directly after a user rated a game on the exit screen.

HTTP request

Protocol

https

Method

POST

Host

devs.ouya.tv

Path

/api/v1/ratings

Headers

Standard headers

GET parameters
auth_token

Same as X-OUYA-AuthToken

POST parameters
auth_token

Same as X-OUYA-AuthToken

game

Package name of the game

E.g. com.littleguy77.filepwn

score

integer

1 to 5:

1

Hate it

2

Don't like it

3

Like it

4

Really like it

5

Love it

HTTP response

Status code

200 OK

Content-type

application/json; charset=utf-8

Example:

{
    "success": true
}

GET https://devs.ouya.tv/api/v1/recommendations

Get a list of games for the "you may also like" section.

Games already installed on the OUYA will be shown, too - with a checkmark.

Usage

HTTP request

Protocol

https

Method

GET

Host

devs.ouya.tv

Path

/api/v1/recommendations

Headers

Standard headers

GET parameters
auth_token

Same as X-OUYA-AuthToken

uuid

Package name of the game that is being exited

Example: net.sourceforge.clonekeenplus

HTTP response

Status code

200 OK

Content-type

application/json; charset=utf-8

Example

{
  "games": [
    {
      "rating": {
        "count": 716,
        "average": 4.25
      },
      "image": "https://www.filepicker.io/api/file/VzCsgc3BTx2RiGpTr4Uw",
      "content_rating": "Everyone",
      "version": "7230ac05-d24c-4347-a990-7ac283c17063",
      "uuid": "com.GoldenTricycle.Clark",
      "title": "CLARC"
    },
    {
      "rating": {
        "count": 1108,
        "average": 3.49
      },
      "image": "https://www.filepicker.io/api/file/ej3IxeX8SwKZW5uFOw9g",
      "content_rating": "Everyone",
      "version": "544236ed-6dde-4b9e-8c4f-ac6e8b91bcd3",
      "uuid": "com.sega.sonic4epi",
      "title": "Sonic The Hedgehog 4 Episode I"
    },
    {
      "rating": {
        "count": 522,
        "average": 4.38
      },
      "image": "https://www.filepicker.io/api/file/s8HCRKaSB8wF2hSKbBzQ",
      "content_rating": "Everyone",
      "version": "29457560-1669-45ce-bb19-88c1651c7552",
      "uuid": "com.x10studio.SoManyMe",
      "title": "So Many Me"
    }
  ]
}

POST https://devs.ouya.tv/api/v1/sessions

Log in and obtain a session token.

This token is stored in the console and used in the X-OUYA-AuthToken and X-Token headers as well as the auth_token GET parameter.

Usage

  1. After logging with an existing account

  2. After new user registration

  3. When visiting Manage > Accounts

HTTP request

Protocol

https

Method

POST

Host

devs.ouya.tv

Path

/api/v1/sessions

Headers

Accept-Encoding User-Agent X-OUYA-Console-Id X-OUYA-Device

Content-Type

application/x-www-form-urlencoded

POST parameters
username

User name used to log in

password

User password

HTTP response

Success

When the user logged in successfully.

Note

If the user is already logged in, the old auth_token is returned. No new token is issued in this case.

Status code

200 OK

Content type

application/json; charset=utf-8

Response body example:

{
  "token": "96bfeaae-212d-447b-b4bf-caa5e86c0502"
}

Invalid login data

When the login data are invalid.

Also seen when the data were not available yet (e.g. user freshly registered) but the processes on the server were not finished yet. The OUYA simply tried the request a second time.

Status code

400 Bad Request

Content type

application/json; charset=utf-8

Response body example:

{
  "error": {
    "message": "Invalid authentication data",
    "code": 2001
  }
}

GET https://devs.ouya.tv/api/v1/themes

Load the main menu background image/video.

Usage

  1. During startup before loading the main menu

  2. Every three hours

HTTP request

Protocol

https

Method

GET

Host

devs.ouya.tv

Path

/api/v1/themes

Headers

Standard headers.

GET parameters
auth_token

May be empty.

Does not seem to have any influence on the response.

HTTP response

Status code

200 OK

Content type

application/json; charset=utf-8

Response body definition

background_style

Supported until at least ODK 1.0.12. Latest firmware 1.2.1427 does not support it anymore.

static meant that the image would be scaled. Any value other than static would make the image pan around.

background

Full URL to a backgroud image

video

Supported until at least ODK 1.0.12. Latest firmware 1.2.1427 does not support it anymore.

Video URL had preference over background image URL.

Example

{
  "background_style": "static",
  "background": "",
  "video": ""
}

FIXME: get response with video/image set.

GET https://devs.ouya.tv/api/v1/wallet

Get the account balance and currency.

Usage

After user registration, before the credit card input form is shown.

HTTP request

Protocol

https

Method

GET

Host

devs.ouya.tv

Path

/api/v1/wallet

Headers

Standard headers

GET parameters
auth_token

Same data as in standard header X-OUYA-AuthToken

HTTP response

Status code

200 OK

Content type

application/json; charset=utf-8

Example without credit card data

{
  "requiresPaymentMethod": true,
  "balance": 0,
  "credit_card": null,
  "currency": "EUR"
}

FIXME: Find out if we get that response when giving a dummy number during registration (4111 1111 1111 1111).

Example with credit card data

{
    "balance": 0.0,
    "credit_card": {
        "expires_at": "09/30/2016",
        "last_four": "1234",
        "provider": "MasterCard"
    },
    "currency": "USD",
    "requiresPaymentMethod": true
}

FIXME: Find out if we can disable credit card input by setting requiresPaymentMethod to false.

GET https://devs.ouya.tv/agreements/marketplace.html

Terms of services you have to accept during registration.

Fetched by the browser / web view.

HTTP request

Protocol

https

Method

GET

Host

devs.ouya.tv

Path

/agreements/marketplace.rst

Headers

None of the standard headers required.

GET parameters

None

HTTP response

HTML file

See also

GET https://devs.ouya.tv/update_strings.txt

Labels to show when updating the firmware.

HTTP request

Protocol

https

Method

GET

Host

devs.ouya.tv

Path

/update_strings.txt

Headers

None of the standard headers required.

GET parameters

None

HTTP response

Plain text file with one string per line

Example

Preparing to televise the Revolution…
Downloading awesome sauce…
Maximizing fun level…
Shifting bits…
Tasting rainbows…

GET http://ouya-updates.s3.amazonaws.com/updates-ouya_1_1.json

Information about the latest firmware. Only used by old firmware versions like 1.0.138 and 1.0.158.

Firmware 1.0.248 and later do not check this URL anymore and use GET https://devs.ouya.tv/api/firmware_builds instead.

HTTP request

Protocol

http

Method

GET

Host

ouya-updates.s3.amazonaws.com

Path

/updates-ouya_1_1.json

HTTP response

Status code

200 OK

{
  "result": [
    {
      "filename": "OUYA-1.2.1084-r1.zip",
      "timestamp": "1400714704",
      "md5sum": "ed9f1712988c5ec2033f44fabe8e6297",
      "channel": "stable",
      "url": "http://devs-ouya-tv-prod.s3.amazonaws.com/ota/RC-OUYA-1.2.1084-r1_ota.zip",
      "requiredUpto": "1.2.995",
      "changes": "https://devs.ouya.tv/api/changelog/ed9f1712988c5ec2033f44fabe8e6297.txt",
      "changesLocalized": {
        "en": "<!doctype html>\r\n<html>\r\n    <head>\r\n...",
        "es": "<!doctype html>\r\n<html>\r\n    <head>\r\n...",
        "fr": "<!doctype html>\r\n<html>\r\n    <head>\r\n...",
        "it": "<!doctype html>\r\n<html>\r\n    <head>\r\n...",
        "de": "<!doctype html>\r\n<html>\r\n    <head>\r\n..."
      },
      "incremental": false
    }
  ]
}

GET https://www.ouya.tv/system_message

Unknown

Usage

HTTP request

Protocol

https

Method

GET

Host

www.ouya.tv

Path

//system_message

Headers
User-Agent

OUYA 0 1.00 1.2.1427_r1

GET parameters
build:

1.2.1427_r1

OUYA firmware version

HTTP response

Status code

403 Forbidden

This was probably once used, but now does only return an error.

Configuration options

It is possible to modify the behavior of the OUYA console by setting config options.

They can be set in two ways:

  1. In an ini-style file ouya_config.properties in the root OUYA directory when attached via USB to a PC (/sdcard/ on the OUYA itself).

  2. On the server, via the GET https://devs.ouya.tv/api/v1/console_configuration JSON file.

Available options

DEBUG

When set to 1, additional output is shown in adb logcat. You will see the remote server URLs that the OUYA is trying to fetch.

KIOSK_MODE

When set to 1, the OUYA is set to a read-only mode.

Only the "play" menu is visible, and it only allows to start games - not even see their details.

Upon inactivity after some minutes, a video /storage/sdcard0/ouya_attract_loop.mp4 is being played.

OUYA_SERVER_URL

Base URL of the API server to connect. By modifying this value, you can switch the OUYA to another server.

Default: https://devs.ouya.tv

OUYA_STATUS_SERVER_URL

Used to check if the OUYA can reach the internet.

This URL needs to return a "204" HTTP status code.

Default: http://status.ouya.tv/api/v1/status

Undocumented options

Only the name of this variables is known:

APP_UPDATE_CHECK_INTERVAL
ATTRACT_LOOP_FILENAME
ATTRACT_LOOP_TIMEOUT
BTC_LAUNCHER_PACKAGES
BTC_PARAMS_APP
BTC_PARAMS_LAUNCHER
CCTEST
COMPARE_OTA_SETTINGS
CRASH_REPORTS
DEBUG_PICASSO
DELETE_ACCOUNTS
DISCOVER_HEADER_TEXT
DONT_DELETE_OTA
ENABLE_AGREEMENTS
ENABLE_BUY_NOW
ENABLE_BUY_NOW_PRICE
ENABLE_BUY_NOW_PRICE_GUIDE
ENABLE_LIKE_BUTTON
ENABLE_REMOTES
ENABLE_TRACES
ENABLE_UPLOAD_LOGS
FORCE_OTA
FORCE_VIDEO_ERROR
INPUT_REMAPPING_JSON_FILE
LOCALE
LOC_MULTIPLIER
LOC_XXX
METRICS_SPEW
METRIC_APP_DETAILS
METRIC_EXIT_GENRE
METRIC_EXIT_STORE
NUM_RECENT_DOWNLOADS_IN_DISCOVER
OUYA_RENAME_CONTROLLER
QUERY_GENDER_DOB
RATING_PROMPT_DELAY
RATING_PROMPT_FREQ
RATING_PROMPT_MAX
SAFE_ZONE
SESSION_UPDATE_DELAY_SEC
SHOW_DISCOUNTS
SYSTEM_MESSAGE_URL
THEME_CHECK_INTERVAL
UPDATE_READY_UI_TIMEOUT
UPDATE_TEXT_URL
UPLOAD_LOGS_SEQ_NUM
USER_MESSAGES
USE_FAKE_VIDEOS
WIFI_STATUS_DISPLAY

About

This documentation has been written by Christian Weiske, cweiske+ouya@cweiske.de.

Last update: 2021-05-19T21:07:14+02:00

License

It is licensed under the GNU Free Documentation License.

Source code

The documentation sources are available at http://git.cweiske.de/ouya-store-api.git/ and mirrored at https://github.com/cweiske/ouya-store-api

Home page

A rendered version of this documentation is available at http://cweiske.de/ouya-store-api-docs.htm

Building

You need to install rst2html5 before:

$ pip install rst2html5-tools

Rendering the docs is done via a build script:

$ ./build.sh