Collection of tools for querying and resolving OTA / SOTA / OPEX / IOT / Downgrade update links for OPPO, OnePlus, Realme devices (ColorOS / OxygenOS).
Current scripts:
C16_transer.py→ resolves dynamic download links (ColorOS 16+)tomboy_pro.py→ main OTA query tool (full / delta / gray / preview / anti-query bypass)opex_query.py→ dedicated OPEX queryopex_analyzer.py→ analyse what OPEX fixed forsota_query.py→ SOTA (Software OTA / modular APK) querysota_changelog_query.py→ SOTA (Software OTA / modular APK) Changelog queryiot_query.py→ legacy & IoT server queryiot_query_new.py→ legacy & IoT server query (new api)downgrade_query.py→ query official downgrade packages (CN only)realme_edl_query.py→ query official EDL packages for Realmechangelog_query.py→ query specific version changelogdesc_query.py→ query specific version changelog urlconfig.py→ configuration for public keys, server addresses, and API endpoints.
- Resolve dynamic links with
downloadCheck? - Displays final download link + expiration time
requests
Install:
pip install requestspython C16_transer.py "https://gauss-componentotacostmanual-cn.allawnfs.com/.../downloadCheck?Expires=1767225599&..."Main advanced OTA query tool — supports full ROM, delta updates, gray channel, preview builds, Genshin editions, anti-query bypass (post-Oct 2025), etc.
- Auto suffix completion (
_11.A/_11.C/_11.F/_11.H/_11.J) - Modes:
manual,client_auto,server_auto,taste --anti 1bypass for ColorOS 16 restricted models- Delta OTA via
--components
requests
cryptography
pip install -r requirements.txtpython tomboy_pro.py <OTA_PREFIX> <REGION> [options]<OTA_PREFIX>PJX110/PJX110_11.A/PJX110_11.C.36_...<REGION>cncn_cmcceuinsgrutrthgltwmyvnidsameaphlabrroe
| Flag | Meaning | Example / Note |
|---|---|---|
--model |
Force model | --model PJX110 |
--gray 1 |
Test channel (mainly Realme, few OPlus) | |
--mode taste |
Often used with --anti 1 |
|
--genshin 1/2 |
Genshin edition (YS / Ovt suffix) | |
--pre 1 |
Preview build (needs --guid) |
|
--guid 64hex |
64-char device GUID | Required for pre/taste |
--components |
Delta query (name:fullversion,...) | --components System:PJX110_11... |
--anti 1 |
Bypass ColorOS 16 query restriction (~Oct 2025) | Usually + --mode taste |
--nvid 8digit |
Use custom NV Carrier ID to query | |
--graynew 1 |
Query FWs not in taste mode but in gray server | |
--recruit 1 |
Query for Beta Stage FWs which needs to apply | |
--orginal_link 1 |
Print Original Link & Resolved Link | |
--pki 1 |
For fix OS17 unable to query for Internal(Testing) Version |
# Basic CN query
python tomboy_pro.py PJX110_11.A cn
# Anti-query bypass for ColorOS 16
python tomboy_pro.py PLA110_11.A cn --anti 1
# Delta OTA
python tomboy_pro.py PJX110_11.C.36_1360_20250814 cn --components System:PJX110_11.C.35_...
# Preview with GUID
python tomboy_pro.py PJX110_11.A cn --pre 1 --guid 0123456789abcdef... (64 chars)
# Custom NVID
python tomboy_pro.py RMX3301_11.H sg --nvid 00011011Note: Get Delta OTA is pretty special, you may get the components info by run getprop | grep ro.oplus.version | sed -E 's/\[ro\.oplus\.version\.([^]]+)\]: \[([^]]+)\]/\1:\2/g' | tr '\n' ',' | sed 's/,$//' | sed 's/base/system_vendor/g' in your device, and make sure using the full OTA version and the same version as your component
Dedicated tool to query OPEX.
python opex_query.py <FULL_OTA_VERSION> <REGION> --info <OS_VERSION>,<BRAND>
# Examples
python opex_query.py PJZ110_11.C.84_1840_202601060309 cn --info 16,oneplus
python opex_query.py RMX5200_11.A.63_... --info 16,realmeNote: Requires complete OTA version string (at least 3 _ segments).
Tool for analyse whay opex package fixed
python opex_analyzer.py <URL>Queries SOTA (Software OTA) — mainly for ColorOS System APPs updates.
python sota_query.py OTA_VERSION REGION --brand BRAND --coloros COLOROS
# Examples
python sota_query.py PJD110_11.F.43_2430_202603192242 cn --brand OnePlus --coloros ColorOS16.0.0
python sota_query.py CPH2573_11.F.43_2430_202603192142 in --brand OnePlus --coloros ColorOS16.0.0Note: All parameters are required (check the example)
Queries SOTA (Software OTA) changelog — mainly for ColorOS System APPs updates changelogs.
python sota_changelog_query.py OTA_VERSION REGION --brand BRAND --coloros COLOROS
# Examples
python sota_changelog_query.py PJD110_11.F.43_2430_202603192242 cn --brand OnePlus --coloros ColorOS16.0.0
python sota_changelog_query.py CPH2573_11.F.43_2430_202603192142 in --brand OnePlus --coloros ColorOS16.0.0Note: The same as sota_query.py but query for changelog only
Query tool using the old iota.coloros.com special server.
Often returns older or special builds no longer available through normal channels.
python iot_query.py <OTA_PREFIX> cn [options]
# Examples
python iot_query.py OWW221 cn
python iot_query.py OWW221_11.A cn --model OWW221Note: Only supports region cn. Results may be outdated.
Query tool for some legacy devices.
python iot_query_new.py OTA_PREFIX HARDWARE_VERSION REIGON
# Example
python iot_query_new.py M6763C A83 cnNote: For devices using this API hardware_version is ro.product.name.
Query official downgrade packages from downgrade.coloros.com (CN only).
Useful when you need older official firmware versions that are still signed and allowed for downgrade.
- Uses AES-256-GCM + RSA-OAEP encryption (matches official downgrade server)
- Requires real DUID (64-char SHA256 string from *#6776#)
- Needs PrjNum (5-digit project number)
- Returns download URL, changelog, version info, MD5, publish time
requestscryptography
Install:
pip install requests cryptographypython downgrade_query.py <OTA_PREFIX> <PrjNum> <snNum> <DUID> [--debug 0/1]
# Example
python downgrade_query.py PKX110_11.C 24821 a1b2c3e4 498A44DF1BEC4EB19FBCB3A870FCACB4EC7D424979CC9C517FE7B805A1937746<OTA_PREFIX>: Must contain at least one_(e.g.PKX110_11.C)<PrjNum>: Exactly 5 digits (e.g.24821)<snNum>: SN Number from phone<DUID>: 64-character SHA256 string (get from dialer code *#6776#)[--debug 0/1]: Get metadata for official downgrade process
Fetch Info:
• Link: https://...
• Changelog: ...
• Version: ColorOS 15.0 (Android 15)
• Ota Version: PKX110_11.C.12_...
• MD5: abcdef123456...
python downgrade_query_old.py <OTA_PREFIX> <PrjNum>
# Example
python downgrade_query_old.py PKX110_11.C 24821<OTA_PREFIX>: Must contain at least one_(e.g.PKX110_11.C)<PrjNum>: Exactly 5 digits (e.g.24821)
Fetch Info:
• Link: https://...
• Changelog: ...
• Version: ColorOS 15.0 (Android 15)
• Ota Version: PKX110_11.C.12_...
• MD5: abcdef123456...
Note: Only works for models/regions that support official downgrade. Server may reject invalid DUID or project number.
Query tool using REALME Server to query for EDL ROM.
python realme_edl_query.py <VERSION_NAME> <REGION> <DATE>
# Examples
python realme_edl_query.py "RMX3888_16.0.3.500(CN01)" CN 202601241320Querying for RMX8899_16.0.3.532(CN01)
Fetch Info:
• Link: https://rms11.realme.net/sw/RMX8899domestic_11_16.0.3.532CN01_2026013016580190.zip
Note: You may get the date from full OTA Version, the third part in _
Query for specific version changelog
<OTA_PREFIX>PJD110_11.F.39_2390<REGION>cncn_cmcceuinsgrutrthgltwmyvnidsameaphlabrroe[--pre 0/1]: Get Testing Version / Testing devices changelogs
python changelog_query.py <OTA_VERSION> <REGION>
# Examples
python changelog_query.py PJD110_11.F.39_2390 cn
python changelog_query.py PLP110_11.A.40_0400 cn --pre 1Note: You are allow not to use full OTA Version, but needed two _ at least(include Version & Version Code)
Query for specific version changelog url
<OTA_PREFIX>PJD110_11.F.39_2390<REGION>cncn_cmcceuinsgrutrthgltwmyvnidsameaphlabrroe
python desc_query.py <OTA_VERSION> <REGION>
# Examples
python desc_query.py PJD110_11.F.39_2390 cn
python desc_query.py PLP110PRE_11.A.40_0400 cnNote: You are allow to use full OTA Version, but also supported two _ at least(include Version & Version Code)
- ColorOS 16 introduced strong anti-query restrictions (~Oct 2025). Use
--anti 1+tastemode + base version (e.g.11.A) intomboy_pro.pyto bypass on many models. - Dynamic links from
downloadCheck?usually expire in 10–30 minutes — useC16_transer.pyimmediately after getting them. downgrade_query.pyare CN-only at the moment.- All tools regenerate encryption keys / device IDs per request to reduce server-side blocking.