• Tech Dev NotesTech Dev Notes
Apps
  • App lookup
  • App compare
Market movement
  • App charts
  • App rankings
Visual proof
  • App screens
  • App listing screenshots
  • App icons
Stacks and releases
  • App tech stacks
  • Tool releases
  • Developers
More
  • X feature flags
  • Grokipedia
  • Blog
  • Follow on X
Skip to content

© 2026 Tech Dev Notes

RSSAboutAPIPrivacyTermsSitemap@techdevnotes

Developers

Public API for tracked apps.

JSON under /api/v1 with a personal API key. Shapes below match the shipped route handlers.

8 v1 endpoints·300 requests / min per key·300 same-origin req / min / IP·Create a key in Account

Auth

API keys

Create a key on your account page. Send it as Authorization: Bearer tdn_… (query keys are not accepted). Keys are rate limited to 300 requests per rolling minute. Invalid or revoked keys return 403; over limit returns 429. Same-origin browser traffic without a key is allowed but IP limited (300/min).

Manage keys at /account. Do not commit keys. Rotate by revoking in Account and creating a new key.

Scope

Tracked apps only

v1 resolves apps that exist in the tracked catalog. Unknown IDs return 404. Pass store=apple or store=google when the id alone is ambiguous.

Caching

CDN-friendly responses

Most JSON list/detail routes set public Cache-Control via publicJson. Export always disables shared caching and uses attachment disposition.

Endpoints

GET /api/v1/apps…

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
Related: browser chart helpers at /api/charts and /api/play-charts, plus tech stack reads at /api/tech-stack, use the same API key auth (same-origin browser fetches are allowed with rate limits). Prefer /api/v1 for automation against tracked apps.