Spore

Spore is a video game developed by Maxis and published by Electronic Arts. The game allows players to create customized creatures, buildings, vehicles, adventures (with expansion pack Spore: Galactic Adventures) and share them with other players via the official game site, Spore.com, by publishing creations in-game or via third-party resources by publishing their 128x128 .png thumbnails without any postprocessing. (Data is embedded within the lowest bits of each pixel of those thumbnails.http://web.archive.org/web/20141218185448if_/http://sporeswap.appspot.com/)
== Numeric IDs ==
Spore website uses 12-digit numeric IDs for assets, users, sporecasts (feeds) and postcards (there are some bugged/technical assets that have short IDs with < 12 digits). In theory, one ID can be assigned to 2 or more entries, for example, an asset and a postcard.
Most of the IDs start with 500* or 501* (since 2015-01-01 16:54:20).
300* IDs are related to the staging server of Maxis.
600* IDs don't happen on the official Spore website, though a fan-made server for Spore uses them. https://github.com/Rosalie241/SporeServer
=== Oddities ===
The asset upload endpoint on the official Spore server allows any numeric ID to be used. Due to this, we have some assets with bugged IDs.
Here is the full list of them.
* 65* (12-Oct-2008 16:43)
* 106* (18-Jan-2009 04:57)
* 140* (28-Oct-2012 17:46)
* 355 (30-Jan-2009 04:22)
* 361 (25-Sep-2008 20:10)
* 393 (28-Sep-2008 17:35)
* 418* (25-Jan-2009 15:06)
* 429 (29-Oct-2010 00:29)
* 454 (26-Feb-2009 23:37)
* 475* (06-Oct-2008 12:26)
* 577* (03-Jan-2015 20:14)
* 733 (27-Dec-2009 19:49)
* 823 (08-Jan-2010 03:20)
* 903* (02-Oct-2008 00:53)
* 915 (01-Apr-2009 19:03)
* 971 (31-Dec-2008 10:53)
* 1007 (28-Oct-2011 00:54)
* 1032 (28-Oct-2011 00:54)
* 1063 (05-Sep-2010 09:20)
* 1111 (04-May-2009 04:20)
* 1186 (14-Sep-2008 06:17)
* 1228* (15-Sep-2008 17:18)
* 1251* (27-Feb-2009 02:08)
* 1282* (04-Sep-2009 14:49)
* 1321* (03-Oct-2008 15:26)
* 1432 (26-Oct-2008 00:36)
* 1511* (16-Oct-2008 17:44)
* 704523175* (26-Jul-2009 20:10)
* 177325080**
* 531654522**
* 680256650**
* 1012164645**
* 1385337452**
* 1845528953**
* 1875627670**
* 2937832959**
* 3205292240**
* 3267866964**
* 3874981157**
* 3905554096**
* 3975592040**
* 4020099059**
* 4088006058**
* 4131088465**
* missing from the database, but still on the static server.
** doesn't have any corresponding static data, but still in the database.
== Site API ==
=== Public ===
Official Spore API documentation is available here: http://www.spore.com/comm/samples
 	URL 	Comments	
Static Data 	/static/model/<subId1>/<subId2>/<subId3>/<AssetId>.xml 	
Asset XML model.
Sub IDs are 3-digit partitions of the Asset ID (like 500:123:456:789).
Should be requested on static subdomain which uses CDN.	
Static Data 	/static/thumb/<subId1>/<subId2>/<subId3>/<AssetId>.png 	
Asset PNG 128x128 thumbnail. Can be imported into the game.
Sub IDs are 3-digit partitions of the Asset ID (like 500:123:456:789).
Should be requested on static subdomain which uses CDN.	
Static Data 	/static/image/<subId1>/<subId2>/<subId3>/<AssetId>_lrg.png
/static/image/<subId1>/<subId2>/<subId3>/<AssetId>_2_lrg.png
/static/image/<subId1>/<subId2>/<subId3>/<AssetId>_3_lrg.png
/static/image/<subId1>/<subId2>/<subId3>/<AssetId>_4_lrg.png	
Asset PNG 256x256 image.
_2_, _3_, _4_ are for additional adventure images.
Sub IDs are 3-digit partitions of the Asset ID (like 500:123:456:789).
Should be requested on static subdomain which uses CDN.	
Static Data 	/static/postcard/<Date>/<subId1>/<subId2>/<subId3>/<PostcardId>.jpg (.png) 	
Postcard image.
Date is the date when the postcard was sent (YYYYMMDD).
Sub IDs are 2-digit partitions of the Postcard ID (like 5002:72:39:83:32).
Should be requested on static subdomain which uses CDN, although the site itself only uses www for postcards.	
REST Service 	/rest/stats 	
Get daily stats about Spore.com.	
REST Service 	/rest/creature/<CreatureAssetId> 	
Get various stats like height, diet, abilities etc. for a creature.
Returns <status>0</status> if the asset is not a creature or if the ID is invalid.	
REST Service 	/rest/user/<Username> 	
Get profile pic, tagline, user id and creation date for a username.
Returns <status>0</status> if the username is invalid.
Note that all the non-ASCII symbols will be replaced with ? in the response.	
REST Service 	/rest/assets/user/<Username>/<StartIndex>/<Length>/<AssetType> 	
Get asset id, name, creation date, type, parent and rating for a list of assets created by a user.
Always returns <status>1</status>.
The maximum length is 500 assets per request.
Ignores additional adventure images.
Note that all the non-ASCII symbols will be replaced with ? in the response.	
REST Service 	/rest/sporecasts/<Username> 	
Get id, name, tags, subscription count, rating etc. for Sporecasts subscribed to by a user.
Returns <status>0</status> if the username is invalid.
The maximum length is unknown.
Note that all the non-ASCII symbols will be replaced with ? in the response.	
REST Service 	/rest/assets/sporecast/<SporecastId>/<StartIndex>/<Length> 	
Get asset id, and name for assets in a sporecast.
Returns both <status>1</status> and <status>0</status> if the sporecast ID is invalid.
The maximum length is 500 assets per request.
Ignores additional adventure images.
Note that all the non-ASCII symbols will be replaced with ? in the response.	
REST Service 	/rest/achievements/<Username>/<StartIndex>/<Length> 	
Get number of achievements for user and a list of achievement ids and unlock-dates.
Returns <status>0</status> if the username is invalid.
The maximum length is 500 achievements per request (the real maximum achievements count is 151, 102 vanilla + 49 Galactic Adventures EP).
Note that all the non-ASCII symbols will be replaced with ? in the response.	
REST Service 	/rest/asset/<AssetId> 	
For a given asset ID, get name, description, tags, 10 latest comments, type, parent, rating, creation date and author name/id.
Returns <status>0</status> if the asset ID is invalid.
Note that all the non-ASCII symbols will be replaced with ? in the response.	
REST Service 	/rest/comments/<AssetId>/<StartIndex>/<Length> 	
For a given asset ID, get a list of comments, sender names, and comment dates.
Returns <status>0</status> if the asset ID is invalid.
The maximum length is unknown.
Note that all the non-ASCII symbols will be replaced with ? in the response.	
REST Service 	/rest/users/buddies/<Username>/<StartIndex>/<Length> 	
For a given username, get a list of buddy names and ids and total buddy count.
Returns <status>0</status> if the username is invalid.
The maximum length is unknown.
Note that all the non-ASCII symbols will be replaced with ? in the response.	
REST Service 	/rest/users/subscribers/<Username>/<StartIndex>/<Length> 	
For a given username, get the list of users who have added that username as a buddy.
Returns <status>0</status> if the username is invalid.
The maximum length is 500 users per request.
Note that all the non-ASCII symbols will be replaced with ? in the response.	
REST Service 	/rest/assets/search/<ViewType>/<StartIndex>/<Length>/<AssetType> 	
List creations for a given view.
View types:
TOP_RATED
TOP_RATED_NEW
NEWEST
OLDEST
FEATURED
MAXIS_MADE
RANDOM
CUTE_AND_CREEPY
TOP_RATED
THERESA_VISION
ALL
Asset types:
CREATURE
BUILDING
VEHICLE
UFO
ADVENTURE
Uses NEWEST view if the requested one doesn't exist.
Ignores asset type if the requested one doesn't exist.
The maximum length is 500 assets per request.
Note that all the non-ASCII symbols will be replaced with ? in the response.	
REST Service 	/rest/assets/find/<Query>/<StartIndex>/<Length>/<AssetType> 	id 	(number: ID of the creation)
name / plain text	(string: name of the creation) 	 	
author 	(string: username of the author of the creation) 	 	
description 	(string: description of the creation) 	 	
tags 	(string: tags of the creation) 	 	
created 	(number: date of uploading in YYYYMMDD format) 	 	
function 	(string: BROKEN) 	 	
locale 	(string: BROKEN) 	 	
type 	(string: BROKEN, also shouldn't be used in a query since the endpoint itself has it as an argument)	 	
is_original 	(bool: is the creation completely new or based on another one) 	 	
is_quality 	(bool: does the creation have 2+ rates up or not) 	 	
is_featured 	(bool: is the creation featured or not) 	 	
is_slurped 	(bool: is the creation uploaded automatically when playing the game or published manually) 	 	
=== Internal ===
 	URL 	Method	Form Data	Comments
Flash Widget 	/view/user-thumbnail-count/<UserID>/<StartIndex>/<Length>	GET 	— 	
Used for a personal Flash widget, which can be grabbed on this page: http://www.spore.com/view/tools/widget
Returns an XML with a user tagline and a list of assets with their IDs, names, and thumbnail links.
The widget itself sends only /0/100 requests, although this endpoint has no length limit.
DWR Interface	W.I.P. 	POST 	W.I.P. 	Should be researched in the future.
== Tools ==
* SporeTools - a simple collection of tools for Spore written in TypeScript. Includes DWR API client.
* Spore PNG Downloader - a simple CLI app that downloads all creations by a specific user or in a specific feed (only 128x128 thumbnails).
* sporeget - a Docker image with CLI utility, saves the creations into .warc files using wget-lua with all the additional data available through GET.
* spore_id_gatherer - a Rust code that brutes asset IDs that have existing thumbnails in the filestore. 
== References ==