v1 end of life: raw.datafornerds.io will be retired on November 1, 2026. Migration guide →

Python Examples

Fetch and filter data

import requests

response = requests.get("https://api.datafornerds.io/v2/microsoft/windows-update-history.json")
response.raise_for_status()
payload = response.json()

print(f"Dataset: {payload['metadata']['dataset']}")
print(f"Records: {payload['metadata']['recordCount']}")

# Filter to latest Windows 11 standard updates
win11 = [
    r for r in payload["data"]
    if r["MajorVersion"] == 11 and r["ReleaseType"] == "Standard"
]
for update in sorted(win11, key=lambda r: r["ReleaseDate"], reverse=True)[:5]:
    print(f"  {update['ReleaseDate']}  {update['KBNumber']}  {update['OSBuild']}")

Build a lookup dictionary

import requests

data = requests.get("https://api.datafornerds.io/v2/microsoft/language-codes.json").json()["data"]
lcid_to_bcp47 = {r["LanguageCode"]: r["BCP47"] for r in data}

print(lcid_to_bcp47["1033"])  # en-US
print(lcid_to_bcp47["1036"])  # fr-FR

Efficient polling with ETag

import requests

url = "https://api.datafornerds.io/v2/microsoft/windows-update-history.json"
etag = None

def get_updates_if_changed():
    global etag
    headers = {"If-None-Match": etag} if etag else {}
    response = requests.get(url, headers=headers)

    if response.status_code == 304:
        print("No changes")
        return None

    response.raise_for_status()
    etag = response.headers.get("ETag")
    data = response.json()
    print(f"Updated: {data['metadata']['recordCount']} records")
    return data

Export to CSV with pandas

import pandas as pd
import requests

data = requests.get("https://api.datafornerds.io/v2/microsoft/m365-apps-update-history.json").json()["data"]
df = pd.DataFrame(data)
df["ReleaseDate"] = pd.to_datetime(df["ReleaseDate"])
df.sort_values("ReleaseDate", ascending=False, inplace=True)

# Latest release per channel
latest = df.groupby("ChannelName").first().reset_index()
print(latest[["ChannelName", "Version", "Build", "ReleaseDate"]])

# Export
df.to_csv("m365-apps-history.csv", index=False)