LoginLogin
Nintendo shutting down 3DS + Wii U online services, see our post

SmileBASIC API

Root / Submissions / [.]

MasterR3C0RDCreated:

Announcement (10/06/2020):

I just wanted to let anyone who wanted to use this API know that this is pretty safe to use. All downloaded files are cached, and as such it avoids sending more than the required amount of requests to SmileBASIC servers. If you're doing a large amount of automated queries at one time, please check out the WebSocket Query API, as it provides less overhead on the server and adds additional features like queueing requests. Also, there might be a new feature soon :) Quick jump: News Introduction Usage Examples SiteJS plugin Credits WebSocket Query API

NEWS:

  • 03/26/2020: Fixed a bug that was causing long load times. I don't know if anyone noticed this, but it was taking like 3 seconds per request. Not any more!
  • 03/16/2020: Added English tag support! When using the `info` endpoint, add ?en=1 for the official English tags. They haven't been updated but should give a better idea of what each tag is. This also works with ?json=1 and the WebSocket Query API!
  • 02/29/2020: Added tags to the info page! Only Japanese tags for now because official tag data for English is not very good right now, but will be updated in the future!
  • 02/04/2020: WebSocket query API implemented! Read more details below.
  • 01/31/2020: SBAPI 4 has launched! If you're using the SBAPI SiteJS, please update it to support SB4 keys.
Introduction SmileBASIC API (SBAPI) is a service created by me (MasterR3C0RD) and triangle, with help from Yttria, 12Me21, and snail_, that allows you to get info for and download programs directly from SmileBASIC 3 servers. Not only is this useful for moderators to check if a key is still available, it also allows users to post GRPs to the forums as a PNG. Usage: Everything in SBAPI is simply a URL. The basic URL format for keys is http://sbapi.me/get/(key)[/(filename)]/(encoding), where anything in [] is optional and anything in () is required. key should be replaced with the public key, and filename allows you to choose a specific file if the key is a project. The encoding is required and can be one of the following:
  • info - all files, shows information about the file provided (use ?json=1 if you're writing a program to get information as JSON, add en=1 for English tags)
  • list - only projects, lists all files (use ?json=1 if you're writing a program to get information as JSON)
  • zip - only projects, download all files from the project as a ZIP file. If you want to convert files to their preferred format (ex, GRP -> PNG, TXT -> Text), add ?nice=1
  • raw - all files, downloads the raw file.
  • text - only TXTs, returns the text content of the file
  • code - only TXTs, highlights code using 12Me21's SBHighlight library (use ?wrap=1 to enable word-wrapping)
  • png - only GRPs, converts the GRP to a PNG
  • json - only DATs, returns the DAT information as a JSON array of arrays.
  • csv - only 2D DATs, converts the data to a CSV (comma-separated values) file
  • icon - only META files, returns the icon as a PNG file.
  • downloads - all files, returns a PNG with the download count (download count is only updated every 24 hours). You can also control the PNG using query parameters: ?color=#BADA55&stroke=#A55A55&strokewidth=3&padding=3&bgcolor=rgba(0,0,0,0.5)
  • encodings - all files, returns JSON array with all possible encodings for the file given
Other encodings may be added in the future. Examples: Disclaimer: Authors of projects or assets displayed on this page are not associated with and have not contributed to the SmileBASIC API project. This can be used when asking people to debug code on the forums. Posting a public key and a link to the code could make debugging much easier. Example: http://sbapi.me/get/CKANY53Y/TN_SHARP/code (Phil's N# compiler) Output: Wanting to show off your sprites is another possible use. Simply use the PNG endpoint. Example: http://sbapi.me/get/4DH5P4K3/BBG_TIKI/png (sprites from cujo1992's Tiki Descent) Output: You can also back up your project as a ZIP file if you need to be sure you'll always have it. Example: http://sbapi.me/get/P3T43E3V/zip (kantackistan's Virtual Buffalo) Output: Don't forget a download counter to gauge how popular your programs are! Note that the download count is not real time, and only updates every 24 hours. Example: http://sbapi.me/get/QK4N3PZF/downloads (calc84maniac's Spooky Maze Raycaster demo) Output: Optional SiteJS: If you think it's too much of a hassle to have to go through the API to check out information about programs, you have a similar mindset to I. That's why me and 12Me21 wrote a SiteJS, available at http://sbapi.me/sbapi-sbs.js that adds an extra section to pages that looks something like this: Simply copy and paste the contents into your SiteJS and load up a program page. After a few seconds, the information will load and be shown on the page. WebSocket Query API If you're doing multiple requests, the best way to accomplish this is using the WebSocket Query API. Simply connect to ws[s]://sbapi.me/get and send a request, and you'll get something back. You can either do: Request: (key[/version[/filename]]) info [prop1,prop2.subprop2] - Gets information about a program. Response: (key[/version[/filename]]) (value) - Value will either be the entire JSON-encoded info object (if no properties are provided), a single JSON-encoded value (if one property is provided), or a JSON-encoded object of all properties requested and their values (if multiple properties are provided). This info object uses a different format than the `info` encoding, test it first by not providing any property arguments. OR Request: (key[/version[/filename]]) download [encoding[?options]] - Gets the file as a specified encoding (or the raw file if none is specified). Any encodings that allow options work exactly the same as if options were provided Response: (key[/version[/filename]]) (filename) (datalength) (data) - Datalength will be the ASCII representation of the size of the data returned, and data will be the response of the encoding. If a request fails, you will get a response similar to such: (key[/version[/filename]]) FAIL If you get this and you're sure you're not doing anything wrong, send me a DM and I'll take a look. NOTE: Send multiple requests separated by \n, eg, `KEY1 info\nKEY2 info` or otherwise you will end up never getting a response in the end. Some requests async are fine, but not all. Credits
  • triangle - file format guru, wrote the file parser used for SB files and other parts of code, and most of reverse engineering of SmileBASIC's servers, donated 3DS information for the server
  • MasterR3C0RD - hosting, wrote the server communication libraries and helped with reverse engineering of SmileBASIC's servers
  • 12Me21 - wrote sbhighlight and rewrote the SiteJS plugin to work with more browsers
  • snail_ - working on proper documentation for API
  • Yttria - word of reason, helped with multiple things internally
  • Jaku - helped with SB4 support

I replaced the official SBS SiteJS with Snail's, which makes the plugin no longer silently fail on SB4 keys, and I also fixed the issue with a certain popular game's availability on SBAPI. I've poked around at SB4 API things when I wasn't busy and it's looking close to impossible to add SB4 compatibility. I don't have a Switch to do any real reverse engineering work on it though, so if anyone with CFW and SB4 is interesting in working on support, message me on Discord (@MasterR3C0RD#7695). Also, this project is serving a second function as a way to archive the entire SmileBASIC library. If anyone is interested in helping further this goal by providing a list of keys to back up, DM me on Discord. A huge thanks to everyone for the support I've gotten for this project. I am accepting donations to keep the server running now. If you're interested you can check my profile to find my PayPal. All donations are appreciated, but are not required to use this service.

This is cool!! I can't believe you can check download count. I don't even think the app itself allows that, does it?

Is it me or doesn't it work with some programs BC. I tested this http://sbapi.me/get/N3VX53ED/SUPER_BASIC/code and it said "Bad key" eventough it is correct :/

Replying to:Tarudahat
Is it me or doesn't it work with some programs BC. I tested this http://sbapi.me/get/N3VX53ED/SUPER_BASIC/code and it said "Bad key" eventough it is correct :/
http://sbapi.me/gui.html It works if you put the key here. Something... must be done wrong somehow and that error must be a default error or something...?

Replying to:Tarudahat
Is it me or doesn't it work with some programs BC. I tested this http://sbapi.me/get/N3VX53ED/SUPER_BASIC/code and it said "Bad key" eventough it is correct :/
You used the wrong filename first check http://sbapi.me/get/N3VX53ED/info (works) the real filename is TSUPER_BASIC http://sbapi.me/get/N3VX53ED/TSUPER_BASIC/code

You could have a /poll endpoint (properly throttled obviously) so the information can be polled from SB servers on demand if any of this errors occur.

Replying to:hakke
You could have a /poll endpoint (properly throttled obviously) so the information can be polled from SB servers on demand if any of this errors occur.
It's too unsafe to add such a functionality.

Replying to:Midnight
This is cool!! I can't believe you can check download count. I don't even think the app itself allows that, does it?
Nope, it doesn't. I wish it was visible though because it's super cool to know analytics wise. I might end up adding analytics for programs just for shits and giggles, but I'd have to gauge interest first (I don't want to waste my time doing something only for it to not get used ever)

Replying to:Tarudahat
Is it me or doesn't it work with some programs BC. I tested this http://sbapi.me/get/N3VX53ED/SUPER_BASIC/code and it said "Bad key" eventough it is correct :/
Because of the way I wrote the server, "Bad key" is simply anytime something can't be found. Will fix this soon, give me a few hours. EDIT: Done! Wrong filenames now show "Bad filename" instead of "Bad key".

The /Info endpoint is now a HTML webpage, supporting OpenGraph to make it embed all pretty like in Discord. Also, I fixed an issue with non-existent files where it said that the key was bad. Feel free to suggest more features here!

*looks at front page thumbnail* "S Bapi"

Replying to:Midnight
*looks at front page thumbnail* "S Bapi"
aw record never credited me for drawing the icon lol

Replying to:Midnight
*looks at front page thumbnail* "S Bapi"
RECORD EGGSPLAIN WHY UO NO CREDIT 12ME12 LOGO

Replying to:Midnight
*looks at front page thumbnail* "S Bapi"
Ou nuuuuuu, sozzzzzz 12eM21, me sozzzzzzzzzzzzz ;(((((

This can be used to upload infinite projects, how? Well upload one then delete it SBAPI should be able to get the deleted program info and files.

Replying to:Tarudahat
This can be used to upload infinite projects, how? Well upload one then delete it SBAPI should be able to get the deleted program info and files.
Yeah... do this if you want to kill R3CORD's storage...

Replying to:Tarudahat
This can be used to upload infinite projects, how? Well upload one then delete it SBAPI should be able to get the deleted program info and files.
@banana Honestly, I think project caching is just a bad idea in the first place. Unless cached projects are automatically deleted from the server over time, the server storage will eventually run out of space.

Replying to:Tarudahat
This can be used to upload infinite projects, how? Well upload one then delete it SBAPI should be able to get the deleted program info and files.
As of the moment of writing this, 2226 public keys have been stored on SBAPI, which has used up a measly 500MB of my server's 14GB. As such, I'm not exactly worried about storage, because this is archiving the servers and every project that has been uploaded to them and requested, which could be useful if SmileBoom shuts down their servers. However, if the API starts being abused, I'll be making a number of changes that I really don't want to make. Don't use this for uploading "infinite projects", all you're doing is wasting space.

Replying to:Tarudahat
This can be used to upload infinite projects, how? Well upload one then delete it SBAPI should be able to get the deleted program info and files.
Well, still. Let's not abuse please :(((

Replying to:Tarudahat
This can be used to upload infinite projects, how? Well upload one then delete it SBAPI should be able to get the deleted program info and files.
Also logically, infinite projects take up infinite space lol