API

All endpoints accept requests from any origin. Range requests are not supported by any endpoint.

GET /caches.json

Returns a list of all caches, including all data available on the main caches page, in JSON format:

[
    {
        // The cache's internal ID.
        "id": 1,

        // A scope is a group of related games. Missing groups are only located
        // from caches for games in the same scope.
        //
        // Currently the "runescape" scope is used for the "runescape" and
        // "oldschool" games. Each FunOrb game has its own scope.
        //
        // Your code must be prepared for new scopes to be added in the future.
        "scope": "runescape",

        // The game's name. Your code must be prepared for new games to be
        // added in the future.
        "game": "runescape",

        // Currently either "live" or "beta", but your code must be prepared
        // for new environments to be added in the future.
        "environment": "live",

        // The language's ISO-639-1 code. Currently either "en", "de", "fr" or
        // "pt", but your code must be prepared for new languages to be added
        // in the future.
        "language": "en",

        // A list of build numbers the cache is associated with, which may be
        // empty if the build number(s) are not known.
        "builds": [
            {
                // The major number is always set.
                "major": 549,

                // The minor number may be null.
                "minor": null
            },
            {
                "major": 550,
                "minor": null
            }
        ],

        // The earliest timestamp the cache was available to users, in ISO 8601
        // format. May be null if not known.
        "timestamp": "2009-06-12T14:55:58Z",

        // A list of users who provided a copy of this cache.
        //
        // May be empty if the users wished to remain anonymous.
        //
        // The value "Jagex" indicates the cache was directly downloaded from
        // Jagex's servers by the OpenRS2 project, so we are completely certain
        // it is genuine. This value will never be used for a cache obtained
        // from a third party.
        "sources": [
            "Erand",
            "Hlwys",
            "Jagex",
            "K4rn4ge",
            "Nathan",
            "Rune-Wars"
        ],

        // In old engine caches, the number of valid .jag archives that are not
        // missing.
        //
        // In new engine caches, the number of valid JS5 indexes that are not
        // missing.
        //
        // May be null if the cache is still being processed.
        "valid_indexes": 29,

        // In old engine caches, the total number of .jag archives that should
        // exist, based on the cache's CRC table.
        //
        // In new engine caches, the total number of JS5 indexes that should
        // exist, based on the JS5 master index.
        //
        // May be null if the cache is still being processed.
        "indexes": 29,

        // The number of valid files (old engine) or valid groups (new engine)
        // that are not missing. May be null if the cache is still being processed.
        "valid_groups": 71002,

        // In old engine caches, the total number of files that should exist,
        // based on the cache's versionlist.jag archive.
        //
        // In new engine caches, the total number of groups that should exist,
        // based on the JS5 indexes that are available.
        //
        // May be null if the cache is still being processed.
        "groups": 71146,

        // The number of encrypted groups for which a valid key is available.
        // May be null if the cache is still being processed.
        "valid_keys": 1203,

        // The total number of encrypted groups in the cache. May be null if
        // the cache is still being processed.
        "keys": 1240,

        // The total size of all groups in the cache in bytes. May be null if
        // the cache is still being processed.
        "size": 74970573,

        // The number of 520-byte blocks required to store the cache's data in
        // a .dat2 file. May be null if the cache is still being processed.
        "blocks": 185273,

        // A boolean flag indicating if the cache is small enough to be
        // downloaded in .dat2/.idx format. May be null if the cache is still
        // being processed.
        "disk_store_valid": true
    },
    ...
]

GET /caches/<scope>/<id>/disk.zip

Returns a cache as a ZIP archive of .dat/.idx (old engine) or .dat2/.idx (new engine) files. All files are stored underneath a cache subdirectory in the zip archive.

GET /caches/<scope>/<id>/flat-file.tar.gz

Returns a cache as a gzipped tarball of files, where each file in the tarball holds a single file from the cache (old engine) or single group (new engine).

The paths within the archive all have a format of cache/<index>/<file>.dat (old engine) or cache/<archive>/<group>.dat (new engine).

The two byte version trailers are included.

GET /caches/<scope>/<id>/keys.json

Returns a list of valid XTEA keys for the cache in JSON format:

[
    {
        // The ID of the archive containing the group the key is used for.
        // Typically this is 5 (maps), but do note that RuneScape 3 does
        // support encrypting interfaces, though the functionality has not yet
        // been used, and some FunOrb games also have encrypted groups.
        "archive": 5,

        // The ID of the group the key is used for.
        "group": 1,

        // The group's name hash, or null if the group has no name.
        "name_hash": -1153472937,

        // The name of the group, if available, or null if the group has no
        // name or if the name is not known.
        "name": "l40_55",

        // The ID of the map square, if the group is an encrypted loc group
        // (has a name of lX_Z). The map square ID is ((X << 8) | Z).
        // null if the group is not an encrypted loc group.
        "mapsquare": 10295,

        // The XTEA key, represented as four 32-bit integers.
        "key": [
            -1920480496,
            -1423914110,
            951774544,
            -1419269290
        ]
    },
    ...
]

GET /caches/<scope>/<id>/keys.zip

Returns a zip archive file of valid XTEA keys for loc groups. Each key is stored in a text file containing four lines, with each line containing a 32-bit component of the key as a decimal string. The paths within the archive all have a format of keys/<mapsquare>.txt.

GET /caches/<scope>/<id>/map.png

Renders the map squares in the cache, with a coloured outline representing whether we have a valid key for each map square or not:

Empty loc groups may be replaced with an unencrypted equivalent with a cache editor.

GET /caches/<scope>/<id>/archives/<archive>/groups/<group>.dat

Returns a single file (old engine) or group (new engine) in binary format. The response contains a .jag archive (index 0 of an old engine cache), a GZIP-compressed file (the remaining indexes of an old engine cache) or JS5-compressed data (new engine cache, also known as a container). The two byte version trailer is not included.

GET /keys/all.json

Returns a list of all XTEA keys in the database, including candidate keys that have not been validated against any cache.

[
    // The XTEA key, represented as four 32-bit integers.
    [
        -2147135705,
        1113423446,
        1294100345,
        946019601
    ],
    ...
]

GET /keys/valid.json

Returns a list of XTEA keys in the database, only including keys validated against at least one cache.

[
    // The XTEA key, represented as four 32-bit integers.
    [
        -2147135705,
        1113423446,
        1294100345,
        946019601
    ],
    ...
]