Old School Ops

The OSO API

Reading and filing bug reports from outside the site with an API key.

Every game · updated 2026-09-11

The OSO API is how a program reaches this site. It authenticates with a key, never a cookie, and lives under /api/v1/. Today it covers bug reports; the prefix is versioned so that anything added later does not move what is already there.

Getting a Key

Account, then API keys. A key is shown once and stored only as a hash, so there is no way to look it up again. Keys expire after a year unless you say otherwise.

A key acts as you and sees exactly what you would see. Staff-only notes come back only if your own account is staff, checked on every request rather than fixed when the key was made.

Using It

Send the key as a header, never in a URL: query strings end up in server logs, in Referer headers and in your shell history.

curl -H "Authorization: Bearer oso_..." https://oldschoolops.com/api/v1/bugs

Endpoints

Method and pathWhat it does
GET /api/v1/bugsRecent reports. Optional status, game and page.
GET /api/v1/bugs/{ref}One report and its comments.
GET /api/v1/bugs/similarWhether something has been reported already, without filing anything.
POST /api/v1/bugsFile a report.

similar before POST is the half of de-duplication that stops a duplicate existing at all: it answers "has this been reported" without writing a row.

Response

{
  "generated_at": "2026-09-05T12:00:00Z",
  "count": 2,
  "page": 1,
  "bugs": [
    {
      "ref": "RF2232-261",
      "title": "Pit bosses never healed",
      "game": "rf2232",
      "status": "fixed",
      "severity": "normal",
      "reporter": "Somebody",
      "created_at": "2026-08-01T09:12:00Z",
      "updated_at": "2026-08-14T16:40:00Z",
      "url": "https://oldschoolops.com/bugs/RF2232-261"
    }
  ]
}

Field names are a contract. Timestamps are RFC 3339 in UTC.

Errors

StatusMeans
401No key, or the key was not accepted
403The key has no access to that
404No such report
429Too many requests

A rejected key returns 401 whether it is unknown, revoked or expired. The three are one answer deliberately: telling them apart confirms which half of a guess was right.

Revoking

Account, then API keys, then Remove. It stops working immediately.

Something here wrong?

Out of date, incomplete, or assuming something it should not. Documentation errors are bugs, and this one arrives tagged and pointed at this page.

Loading…
Open the full search page