Public · Read-only · API v1

OTA Catalog API

Public, read-only catalog of OTA entries from the OnePlus ROM and firmware archive.

GET · HEAD · OPTIONS CORS enabled 300 s cache ETag / HTTP 304

Filters

deviceFilter by the device label, case-insensitive.
regionFilter by the region code, case-insensitive.
modelFilter by the canonical model code, case-insensitive.
idReturn the release with this ID.
latestSet to 1 to return only the newest release for each matching device and region.
sinceReturn releases with a vendor build timestamp newer than this ISO 8601 date or timestamp.

Efficient update checks

Keep the response ETag and send it with the next request:

If-None-Match: "stored-etag"

An unchanged catalog returns HTTP 304 without a response body. A polling interval of at least 900 seconds is recommended.

Examples

https://roms.danielspringer.at/api/ota.php
https://roms.danielspringer.at/api/ota.php?device=OP+13
https://roms.danielspringer.at/api/ota.php?device=OP+13&region=EU
https://roms.danielspringer.at/api/ota.php?model=CPH2653
https://roms.danielspringer.at/api/ota.php?device=OP+13&region=EU&latest=1
https://roms.danielspringer.at/api/ota.php?since=2026-07-01
https://roms.danielspringer.at/api/ota.php?id=RELEASE_ID

Release fields

idStable identifier for this catalog entry.
deviceDevice label.
regionOTA region code.
modelCanonical device model code extracted from the OTA metadata.
versionHuman-readable release version.
ota_versionOTA package version from the catalog.
build_timestampVendor build timestamp extracted from ota_version; timezone unspecified.
security_patchAndroid security patch level, when available.
source_urlUnresolved source URL stored in the catalog.
changelog_urlRelease changelog URL, when available.
is_latestWhether this is the newest catalog entry for its device and region.

Important details

  • source_url is the URL stored in ota_config.ini.
  • The API does not resolve redirects or generate temporary CDN links.
  • Use + for every space in device names: OPPO FIND X8 PRO becomes OPPO+FIND+X8+PRO.
  • Query parameter values should be URL-encoded.
  • Filters can be combined and are applied with AND semantics.
  • build_timestamp is extracted from ota_version. Its timezone is not declared by the vendor, so it is not a publication timestamp.
  • since compares the vendor build timestamp, exclusively. A date means midnight UTC for comparison purposes.
  • is_latest and latest=1 use the vendor build timestamp, with the natural version order as a deterministic fallback.
  • Without latest=1, releases retain the original natural ascending device, region, and version ordering.
  • For efficient polling, store the ETag and send it back in If-None-Match. An unchanged catalog returns HTTP 304.