OUYA store API documentation
This is an attempt to document the API used by OUYA gaming consoles to speak with devs.ouya.tv.
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: OUYA 0 1.00 1.2.1427_r1
Razer Forge TV: Dalvik/2.1.0 (Linux; U; Android 6.0.1; Forge Build/M-MMB29M-rzs-us-sf-bld2-19HP-08.02.AM)
- 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
During the OUYA setup (Parameter oobe=true is set)
During bootup
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.."
}
}
]
}
POST https://devs.ouya.tv/api/razer/gamer
Register a new account on a Razer Forge TV.
Similar to POST https://devs.ouya.tv/api/v1/gamers, but uses different POST data.
Request
POST data
E-mail address
- password
Password
- email_opt_out
Inverted checkbox "Opt-in for emails from Razer".
Value: true or false
Response
See POST https://devs.ouya.tv/api/v1/gamers.
Validation error for e-mail is in the email property.
PUT https://devs.ouya.tv/api/razer/gamer
Update the gamer profile (store the nickname during login).
FIXME: Undocumented.
POST https://devs.ouya.tv/api/razer/session
Login to the Razer Cortex store on the Razer Forge TV.
Similar to the OUYA login POST https://devs.ouya.tv/api/v1/sessions, but with e-mail instead of username.
HTTP request
- Protocol
https
- Method
POST
- Host
devs.ouya.tv
- Path
/api/razer/session
- Headers
- User-Agent
Dalvik/2.1.0 (Linux; U; Android 6.0.1; Forge Build/M-MMB29M-rzs-us-sf-bld2-19HP-08.02.AM)
- Accept-Language
de
- X-OUYA-Device
pearlyn
- X-OUYA-Firmware-Version:
(empty)
- X-OUYA-Console-Id
Build serial number
171256710321511
- X-OUYA-Console-Wifi-MAC-Address
C4:8E:8F:82:29:B1
- X-OUYA-VersionCode
10202320
- Content-Type
application/x-www-form-urlencoded
POST parameters
User e-mail address
- password
User password
HTTP response
Success
- Status code
200 OK
- Content-type
application/json; charset=utf-8
After the initial login, GET https://devs.ouya.tv/api/v1/gamers/me is fetched. If its reponse does not contain nickname, the nickname input screen is shown. The nickname is then stored via PUT https://devs.ouya.tv/api/razer/gamer.
The CortexFramework code also parses properties razerToken, nickname and avatar but they do not seem to be used.
{
"token": "00702342-0000-1111-2222-c3e1500cafe1"
}
GET https://devs.ouya.tv/api/v1/apps/xxx
Fetch the details for an app/game.
Usage
When the user enters the detail page in the discover store.
Sometimes the OUYA refreshes details of all installed apps while running.
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
When the user clicks "download"
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.
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.
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
}
}
GET https://devs.ouya.tv/api/v1/developers/xxx/current_gamer
Fetch gamer information from within a game.
Usage
At the startup of Knightmare Tower and Towerfall (when bought)
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
When the user starts a game and pressed "Sync" in the store (at "Babylonian Twins")
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
HTTP redirects (e.g. 302) are supported.
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
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.
Bundle example
{
"rows": [
],
"tiles": [
{
"bundle": {
"apps": [
"com.GoldenTricycle.Clark",
"com.Tripleslash.MagneticByNature",
"com.Thinice.TwinRobots",
"com.scaryrobot.badbadbots"
],
"currency": "EUR",
"price": 6.99,
"contentRating": "9+",
"purchaseUrl": "ouya://launcher/purchase?developer=ec1a9ccd-373f-4047-bd07-36466ab7e25d&product=ROBOBUNDLE"
},
"url": "ouya://launcher/details?page=be239ca4-10fd-42dd-89cd-1806e80b1362",
"image": "https://s3.amazonaws.com/ouya-screenshots/be239ca4-10fd-42dd-89cd-1806e80b1362/thumbnails/thumbnail20150202-3-6hikjv.jpeg",
"uuid": "be239ca4-10fd-42dd-89cd-1806e80b1362",
"title": "ROBO GAME BUNDLE!",
"type": "details_page"
}
]
}
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
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.
Razer Forge TV uses POST https://devs.ouya.tv/api/razer/gamer instead.
Usage
During registration to check if data are valid
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
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"
}
}
Razer Forge TV want this additional properties:
- nickname
Same as username on the OUYA. When not set, the Forge asks to enter the nickname during login.
- avatar
URL of a custom avatar image
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
After setting up a factory-reset OUYA.
After logging in with an existing account.
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
After logging in with an existing account
(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/community_content
Fetch available community content (e.g. levels) for the game.
HTTP request
- Protocol
https
- Method
GET
- Host
devs.ouya.tv
- Path
/api/v1/games/xxx/community_content
- xxx
app package name
Example: /api/v1/games/tv.ouya.sample.cc/community_content
- Headers
Standard headers
- GET parameters
- auth_token
Same as X-OUYA-AuthToken
- sort
created_at rating updated_at
Sort order
- limit
10
Number of results to return
- offset
Page, only set when > 0
- category
Category filter
HTTP response
Struct taken from tv.ouya.console.api.content.CCSearchResults (full-ouya-framework.apk).
- communityContentCount
int. Required.
- communityContent
array of objects. Required.
- author
String
- authorUuid
String
- category
String
- contentUrl
String
- dependencies
Array of strings
- description
String
- fileSize
int
- flagged
bool
- gameTitle
String
- md5sum
String
- metaInfo
String
- rating
Object.
- average
float
- count
int
- user
Float with F?
- revision
int
- screenshot
Object
- type
String
- urls
Array of objects
- full
String
- thumbnail
String
- tags
Array of strings
- title
String
- uuid
String
POST https://devs.ouya.tv/api/v1/games/xxx/community_content
Upload community content (e.g. levels) to the server.
HTTP request
- Protocol
https
- Method
POST
- Host
devs.ouya.tv
- Path
/api/v1/games/xxx/community_content
- xxx
app package name
Example: /api/v1/games/tv.ouya.sample.cc/community_content
- Headers
Standard headers
- Content-Type
application/x-www-form-urlencoded
- GET parameters
- auth_token
Same as X-OUYA-AuthToken
- POST parameters
- request[uuid]
Example: 0f02f93e-8eb7-44a7-a2c9-d86be692ea85
- request[signature]
Example: R6Jt1GM3IASameqEdMmlVgw6D/9CinsHQlm2FnRtLlbCy2X68JEjB+uAQSOCjEuXKbOpKzQreK481fEYn1quNQwUDu98rGMRfTPsw8tEvuHvY0CyqRKpCBH6DKmsyNU8RUZ4x+Hz64yVQMcNchK0/gEmFPS8WfLdLJeJtIk19gY=
- community_content[title]
Content title, e.g. level name
- community_content[category]
Game-specific category
Example: emblem
- community_content[description]
Level description
- community_content[content]
.zip file contents
File name: content.zip
HTTP response
FIXME
JSON object with properties:
- uuid
String
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
When an app/game is featured and shown on the main menu ("home"), it is checked if the app has already been purchased.
When opening the game details the "buy" button is shown if the "promotedProduct" is in the list of purchases
When a game starts it checks if it has been bought.
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 object 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:
iv
key
blob
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
When the user buys an app/game.
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:
identifier
name
priceInCents
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/partner_builds
Fetch commands for the "OUYA Everywhere" installer.
The OUYA Everywhere installer tv.ouya.oe.installer fetches this URL from the server, installs package updates (framework, console UI) and then starts the actual console UI.
Used on the Mad Catz Mojo and Razer Forge TV.
HTTP request
- Protocol
https
- Method
GET
- Host
devs.ouya.tv
- Path
/api/v1/partner_builds
- Headers
The Razer Forge TV seems to prefix all custom headers with X-OUYA- while the Mojo version only uses X-.
- User-Agent
Known values:
ouya-everywhere-installer (MadCatz/mojo-TS/mojo:4.2.2/JDQ39/MO0205-TS:user/release-keys)
ouya-everywhere-installer (razer/pearlyn/pearlyn:6.0.1/M-MMB29M-rzs-us-sf-bld2-19HP-08.02.AM/144:user/release-keys)
- Accept-Language
de
en-US,en
- X-InstallerVersionCode
Razer Forge TV: 8
- X-InstallerVersionName
Razer Forge TV: 1.08
- X-InstallerPackageName
tv.ouya.oe.installer
- X-OUYA-Console-Id
Build serial number
Razer Forge TV: 171256710321511
- X-Device
??
- X-OUYA-Device
Razer Forge TV: pearlyn
- X-Product
??
- X-OUYA-Product
Razer Forge TV: pearlyn
- X-Model
??
- X-OUYA-Model
Razer Forge TV: Forge
- X-Brand
??
- X-OUYA-Brand
Razer Forge TV:razer
- X-Display
??
- X-OUYA-Display
Razer Forge TV: M-MMB29M-rzs-us-sf-bld2-19HP-08.02.AM.144
- X-BuildId
??
- X-OUYA-BuildId
Razer Forge TV: M-MMB29M-rzs-us-sf-bld2-19HP-08.02.AM
- X-Manufacturer
??
- X-OUYA-Manufacturer
Razer Forge TV: razer
- OUYAUsername
When logged in.
- X-OUYA-AuthToken
Only when logged in already
00702342-0000-1111-2222-c3e1500cafe1
HTTP response
- Status code
200 OK
- Content-type
application/json; charset=utf-8
Response body definition
The response is a list of commands that the OUYA Everywhere installer will execute one after another.
The top-level object contains a key actions, which is an array of action objects. Each action has a action property that defines its type.
exit action
Just stop the installer.
No additional properties.
{
"actions": [
{
"action": "exit"
}
]
}
installFile action
Install the given .apk file if it has not yet been installed.
- action
installFile
- packageName
Name of package to install. Example: de.ouya.cweiske.foo
- friendlyName
Name shown on screen during installation
- md5
Example: d3b07384d113edec49eaa6238ad5ff00
- filesize
12345
- downloadUrl
http://example.org/app.apk
- versionCode
Optional property. Example: 23.
Only install when the current version is lower than this number.
launch action
Start the given application
- action
launch
- packageName
Application to start. Example: de.ouya.cweiske.foo
showDialog action
Show a message that the user has to confirm.
- action
showDialog
- title
Message dialog title string
- message
Actual text
- verticalMargin
Optional. Example: 1.0
uninstallFile action
Remove a package
- action
uninstallFile
- packageName
Example: de.ouya.cweiske.foo
- keepData
Optional boolean. Example: false
- ifLessThanVersionCode
Optional integer. Example: 12
- ifGreaterThanVersionCode
Optional integer. Example: 42
Example
{
"actions": [
{
"action": "installFile",
"packageName": "tv.ouya.oobe",
"friendlyName": "OUYA OOBE",
"md5": "41d50891225591fdd32045ed0821a3bf",
"filesize": 7725861,
"downloadUrl": "http://ouya.cweiske.de/apks/ouya-everywhere/tv.ouya.oobe-1.2.897.apk",
"versionCode": 10200897
},
{
"action": "installFile",
"packageName": "tv.ouya",
"friendlyName": "OUYA Framework",
"md5": "95d987e7b100c2c72bdac37a8eda2647",
"filesize": 3123639,
"downloadUrl": "http://ouya.cweiske.de/apks/ouya-everywhere/tv.ouya-1.2.897.apk",
"versionCode": 10200897
},
{
"action": "installFile",
"packageName": "tv.ouya.console",
"friendlyName": "OUYA launcher",
"md5": "97da25989c64a90c60070978077fff55",
"filesize": 18953944,
"downloadUrl": "http://ouya.cweiske.de/apks/ouya-everywhere/tv.ouya.console-1.2.897.apk",
"versionCode": 10200897
},
{
"action": "launch",
"packageName": "tv.ouya.console"
}
]
}
GET https://devs.ouya.tv/api/v1/partner_builds/release_notes
Return the changelog for the latest OUYA everywhere installer.
Used by the Razer Forge TV only (Manage > Razer Cortex > "Update Notes").
HTTP request
- Protocol
https
- Method
GET
- Host
devs.ouya.tv
- Path
/api/v1/partner_builds/release_notes
- Headers
- User-Agent
Dalvik/2.1.0 (Linux; U; Android 6.0.1; Forge Build/M-MMB29M-rzs-us-sf-bld2-19HP-08.02.AM)
- Accept-Language
de
- X-OUYA-Device
pearlyn
- X-OUYA-Firmware-Version:
(empty)
- X-OUYA-Console-Id
Build serial number
171256710321511
- X-OUYA-Console-Wifi-MAC-Address
C4:8E:8F:82:29:B1
- X-OUYA-VersionCode
10202320
- X-OUYA-AuthToken
00702342-0000-1111-2222-c3e1500cafe1
HTTP response
- Status code
200 OK
- Content-type
application/json; charset=utf-8
Example
{
"releaseNotes": "This is the latest firmware for the Razer Forge TV."
}
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
When the user tries to exit a game (double-pressing U)
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"
}
]
}
GET https://devs.ouya.tv/api/v1/search
Search for games in the discover store.
HTTP request
- Protocol
https
- Method
GET
- Host
devs.ouya.tv
- Path
/api/v1/search
- Headers
Standard headers
- GET parameters
- auth_token
Same as X-OUYA-AuthToken
- q
Search word(s)
HTTP response
- Status code
200 OK
- Content-type
application/json; charset=utf-8
The count property contains the number of games that matched the search string, even if they are not all returned in the result list. The search result list is limited to 20 or 40 games.
When the count is higher than the number of items in results, the OUYA will send a new search request to the API when another letter is added to the search word.
If the count and results are the same, the OUYA will use the current response and filter it for itself without asking the server again.
Example
{
"count": 1,
"results": [
{
"title": "Frightfight",
"url": "ouya://launcher/details?app=com.appsolutegames.frightfight",
"contentRating": "Everyone"
}
]
}
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.
The Razer Forge TV uses POST https://devs.ouya.tv/api/razer/session instead.
Usage
After logging with an existing account
After new user registration
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.
- 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
During startup before loading the main menu
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
After storing credit card result in PUT https://devs.ouya.tv/api/v1/credit_card.
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:
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).
On the server, via the GET https://devs.ouya.tv/api/v1/console_configuration JSON file.
Available options
ATTRACT_LOOP_FILENAME
Full path to the not-in-use-autoplay video in kiosk mode.
Default: /sdcard/ouya_attract_loop.mp4
CCTEST
When set to 1, the "Manage" menu shows a "[DEBUG] Test CC signup" entry.
CRASH_REPORTS
When set to 1, the "Manage" menu shows a "[DEBUG] Send crash reports" entry. It immediately sends stored crash reports to the server.
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.
DELETE_ACCOUNTS
When set to 1, the "Manage" menu shows a "[DEBUG] Delete user accounts" entry that immediately deletes the user account.
DONT_DELETE_OTA
When an over-the-air update has been downloaded, it gets moved to /cache/update.zip. After moving, the original file gets deleted. This option disabled this deletion.
Default: 0
(in ouya-framework.jar)
DUMP_DISCOVER_PAGES
Store the downloaded API responses for discover category pages on /sdcard/.
ENABLE_AGREEMENTS
When disabled, the regular fetch of /api/v1/gamers/me/agreements will not happen.
Also does not show the agreements during user registration in OOBE.
Default: 1
ENABLE_BUY_NOW
When set to 1, the store details view shows a "buy now" button for games that have the "premium" flag set and a promoted product.
Default: 1
ENABLE_BUY_NOW_PRICE
When set to 1, the store details view shows the product price on the "buy now" button (see ENABLE_BUY_NOW).
Default: 1
ENABLE_BUY_NOW_PRICE_GUIDE
When set to 1, the guide menu (that appears when double-clicking the ouya logo button) shows the price of the promoted product.
ENABLE_UPLOAD_LOGS
Automatically update system logs. Needs super user access for uploading.
Default: 1
FORCE_OTA
When set to 1: Force the OUYA to install an over-the-air update.
Default: 0
FORCE_VIDEO_ERROR
When set to 1: Show an error whenever a video shall be played.
Default: 0
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. (See ATTRACT_LOOP_FILENAME)
LOC_MULTIPLIER
Float value between 1.0 and 3.0
Increases the string length by the given factor by repeating the letters in translatable strings.
LOC_XXX
When set to 1, all letters in translatable strings are replaced with X.
Needs a reboot.
METRIC_APP_DETAILS
When set to 1: Send a tracking notification whenever a details page in the store is shown, along with the app UUID.
OE_MAX_DOWNLOADS
Number of maximum downloads in the queue for non-ouya devices.
Default: 10
OUYA_MAX_DOWNLOADS
Number of maximum downloads in the queue for original OUYA devices.
Default: 5
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
QUERY_GENDER_DOB
Show the gender and birthday input fields during registration in OOBE.
Default: 1
RATING_PROMPT_DELAY
Number of game launches until the "rate this game" prompt is shown.
Default: 0 (after the first launch)
RATING_PROMPT_FREQ
When rating a game has been skipped, it will be tried again after X launches.
0 to disable rating popups.
Default: 5
RATING_PROMPT_MAX
Maximum number of "Rate this game" popups per game.
Default: 0 (infinite)
SAFE_ZONE
Show a grey border around the OOBE screen.
Default: 0
UPDATE_TEXT_URL
When installing an update, funny messages are shown. They are downloaded from this URL.
Default: https://devs.ouya.tv/update_strings.txt
USER_MESSAGES
Comma-separated list of URLs to show to the user. See GET https://devs.ouya.tv/api/v1/gamers/me/user_messages.
Default: empty
WIFI_STATUS_DISPLAY
When set to 1: Shows the current wifi status on the top right of all screens.
Example:
Wifi: INTERFACE_DISABLED, Strenght (0-8): 0
Undocumented options
Only the name of this variables is known:
BTC_LAUNCHER_PACKAGES BTC_PARAMS_APP BTC_PARAMS_LAUNCHER COMPARE_OTA_SETTINGS UPDATE_READY_UI_TIMEOUT UPLOAD_LOGS_SEQ_NUM
Unused options
They are defined in the code, but not used anywhere in OUYALauncher.apk:
APP_UPDATE_CHECK_INTERVAL ATTRACT_LOOP_TIMEOUT COMMUNITY_CONTENT_ENABLED DEBUG_PICASSO DISCOVER_HEADER_TEXT ENABLE_REMOTES ENABLE_TRACES INPUT_REMAPPING_JSON_FILE LOCALE METRIC_EXIT_GENRE METRIC_EXIT_STORE METRICS_SPEW NUM_RECENT_DOWNLOADS_IN_DISCOVER OUYA_RENAME_CONTROLLER SESSION_UPDATE_DELAY_SEC SHOW_DISCOUNTS SYSTEM_MESSAGE_URL THEME_CHECK_INTERVAL USE_FAKE_VIDEOS
About
This documentation has been written by Christian Weiske, cweiske+ouya@cweiske.de.
Last update: 2025-11-09T22:17:11+01: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