osrs-data-hub
Snapshot

Current state of every visible account

GET
/snapshot

Built for polling every 2–10 s (the live map, Home Assistant). Limited to 1 request per 1 s per key, on top of the general limit.

Each account carries id, name, type, type_label, owner and categories (and account_hash for service keys); every other field belongs to one category and is omitted when the key can’t read that category on the account, and null when it can but the plugin never sent it.

Send the last ETag as If-None-Match: while nothing you would see has changed, the answer is 304 Not Modified without a body (it still counts towards the rate limits). With since (the previous meta.last_modified), only accounts that changed after it are returned, re-sending those that changed up to 30 s before it; accounts whose activity the key can’t read are always returned, and an account that leaves the key’s scope simply stops appearing, so fetch without since now and then. A location older than 2 minutes has stale: true.

Authorization

bearerAuth
AuthorizationBearer <token>

An API key from the hub’s API keys page.

In: header

Query Parameters

since?string

Only accounts that changed after this time (pass the previous response’s meta.last_modified). Accounts changed up to 30 s before it are sent again (late commits), and accounts whose activity the key can’t read are always sent.

Formatdate-time

Response Body

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/snapshot"
{  "data": [    {      "id": "string",      "name": "string",      "account_hash": "string",      "type": 0,      "type_label": "string",      "owner": {        "name": "string",        "discord_id": "string"      },      "categories": [        "stats"      ],      "online": true,      "world": 0,      "special_world": true,      "game_state": "string",      "last_seen": "2019-08-24T14:15:22Z",      "hp": {        "current": 0,        "max": 0      },      "prayer": {        "current": 0,        "max": 0      },      "spellbook": "string",      "location": {        "x": 0,        "y": 0,        "plane": 0,        "is_on_boat": true,        "stale": true,        "updated_at": "2019-08-24T14:15:22Z"      },      "skills": {        "total_level": 0,        "overall_xp": 0,        "skills": [          {            "skill": "string",            "level": 0,            "real_level": 0,            "xp": 0          }        ]      },      "equipment": {        "items": [          {            "id": 0,            "name": "string",            "quantity": 0,            "ge_price": 0,            "ha_price": 0,            "equipment_slot": "string",            "inventory_slot": 0          }        ],        "value": 0      },      "inventory": {        "items": [          {            "id": 0,            "name": "string",            "quantity": 0,            "ge_price": 0,            "ha_price": 0,            "equipment_slot": "string",            "inventory_slot": 0          }        ],        "value": 0      }    }  ],  "meta": {    "generated_at": "2019-08-24T14:15:22Z",    "count": 0,    "last_modified": "2019-08-24T14:15:22Z"  }}