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 /caches/<scope>/archives/<archive>/groups/<group>/versions/<version>/checksums/<checksum>.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.

This is faster than the previous endpoint as it doesn't need to look the group's version and checksum up in the JS5 index. If you need to download more than a handful of groups, you should use this endpoint.

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
    ],
    ...
]