GET/api/v1/apps
List tracked apps (id, store, name, category, iconUrl, active). Cache-Control s-maxage=60.
Request
curl -s -H "Authorization: Bearer tdn_YOUR_KEY" \
"https://techdevnotes.com/api/v1/apps"
Example response (shape)
{
"apps": [
{
"id": "6670324846",
"store": "apple",
"name": "Grok",
"category": "Productivity",
"iconUrl": "https://is1-ssl.mzstatic.com/…/512x512bb.jpg",
"active": true
}
],
"count": 1
}GET/api/v1/apps/{id}
Snapshot summary for one tracked app. Query: store=apple|google (required when ambiguous), country (default us). Public JSON cache via publicJson (s-maxage=600).
Request
curl -s -H "Authorization: Bearer tdn_YOUR_KEY" \
"https://techdevnotes.com/api/v1/apps/6670324846?store=apple&country=us"
Example response (shape)
{
"appId": "6670324846",
"store": "apple",
"latestRating": 4.8,
"ratingCount": 120000,
"latestVersion": "1.2.3",
"versionCount": 42,
"rank": 12,
"rankCountry": "us",
"usRank": 12
}GET/api/v1/apps/{id}/rankings
Latest global chart positions for the app. Query: store, chart_type (default top-free). Top-level chartType; each row is country, rank, recordedAt only. Priority hub mirror for rank history.
Request
curl -s -H "Authorization: Bearer tdn_YOUR_KEY" \
"https://techdevnotes.com/api/v1/apps/6670324846/rankings?store=apple&chart_type=top-free"
Example response (shape)
{
"appId": "6670324846",
"store": "apple",
"chartType": "top-free",
"rankings": [
{ "country": "us", "rank": 12, "recordedAt": "2026-06-26 00:00:00" }
],
"count": 1
}GET/api/v1/apps/{id}/versions
Version history with enrichment when collected (storeUpdatedAt, minOs, sizeBytes, contentRating, offersIap, adSupported, languages). Rows use serializeVersion camelCase fields. Query: store, limit (1-200, default 50).
Request
curl -s -H "Authorization: Bearer tdn_YOUR_KEY" \
"https://techdevnotes.com/api/v1/apps/6670324846/versions?store=apple&limit=20"
Example response (shape)
{
"appId": "6670324846",
"store": "apple",
"versions": [
{
"version": "1.2.3",
"releaseNotes": "…",
"firstSeenAt": "2026-06-28T00:00:00.000Z",
"minOs": "17.0",
"sizeBytes": 104857600,
"contentRating": "17+",
"languages": ["EN"]
}
],
"count": 1
}GET/api/compare
Compare bundle for tracked apps (ratings, ranks, versions). Query: apps=slug,slug or ids; days. Prefer for nightly competitor diffs.
Request
curl -s -H "Authorization: Bearer tdn_YOUR_KEY" \
"https://techdevnotes.com/api/compare?apps=grok,chatgpt&days=90"
Example response (shape)
{ "apps": [ { "name": "Grok", "rating": 4.8 } ] }GET/api/v1/apps/{id}/screenshots
In-app screenshot sessions. Each image uses src (signed R2 URL or null if R2 off), not url. Field names: buildNumber, capturedAt, screenName, screenType, etc.
Request
curl -s -H "Authorization: Bearer tdn_YOUR_KEY" \
"https://techdevnotes.com/api/v1/apps/6670324846/screenshots?store=apple"
Example response (shape)
{
"appId": "6670324846",
"store": "apple",
"sessions": [
{
"version": "1.2.3",
"buildNumber": "100",
"capturedAt": "2026-06-18 10:00:00",
"screenCount": 1,
"images": [
{
"filename": "001-Home.png",
"screenName": "Home",
"screenType": "home",
"category": null,
"tags": null,
"description": null,
"depth": 0,
"src": "https://…r2…/signed-or-null"
}
]
}
],
"count": 1
}GET/api/v1/apps/{id}/icons
Icons grouped by binary version under versions[], not a top-level icons[]. Each icon object uses src (signed URL or null).
Request
curl -s -H "Authorization: Bearer tdn_YOUR_KEY" \
"https://techdevnotes.com/api/v1/apps/6670324846/icons?store=apple"
Example response (shape)
{
"appId": "6670324846",
"store": "apple",
"versions": [
{
"version": "1.2.3",
"buildNumber": "100",
"platform": "ios",
"collectedAt": "2026-06-18 10:00:00",
"icons": [
{
"kind": "launcher",
"appearance": "any",
"variantName": null,
"format": "png",
"isVector": false,
"width": 1024,
"height": 1024,
"src": "https://…r2…/signed-or-null"
}
]
}
],
"count": 1
}GET/api/v1/apps/{id}/export
Tabular export only (not an intel JSON bundle). Required semantics: type=snapshots|rankings|versions (default snapshots), format=csv|json (default csv), days (default 90). Returns attachment body: CSV text or a JSON array of row objects with snake_case columns.
Request
curl -s -H "Authorization: Bearer tdn_YOUR_KEY" \
"https://techdevnotes.com/api/v1/apps/6670324846/export?store=apple&type=snapshots&format=json&days=7"
Example response (shape)
// format=json: JSON array of rows (Content-Disposition attachment)
[
{
"recorded_at": "2026-06-25 12:00:00",
"rating": 4.8,
"rating_count": 120000,
"price": 0,
"installs": null
}
]
// type=rankings rows: recorded_at, country, category, chart_type, rank
// type=versions rows: version, release_notes, first_seen_at
// format=csv (default): same columns as a CSV file body, not wrapped in JSON