API

Programmatic access to every scored addon, its review analysis, and the category aggregates. Included with Pro.

Authentication

Every request needs a Pro API key, sent as a bearer token. Generate one on your account page.

curl http://addonintel.com/api/v1/me \
  -H "Authorization: Bearer ai_live_your_key_here"

Keys are shown once. We store only a SHA-256 digest, so a database leak exposes nothing usable — but it also means we cannot show you the key again. Lost it? Regenerate, which immediately invalidates the old one.

Treat a key like a password: it carries your full Pro access. Keep it server-side, never in browser JavaScript or a public repository.

Rate limits

Limits apply per key, not per IP, so colleagues behind one office connection do not consume each other's quota. Two windows run at once:

  • 60 requests per minute — caps bursts.
  • 10,000 requests per day — caps sustained use.

Every successful response reports where you stand, so you can pace yourself rather than discovering the limit by being refused:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 59
X-RateLimit-Reset: 42            # seconds until the window frees a slot
X-RateLimit-Limit-Day: 10000
X-RateLimit-Remaining-Day: 9999

Exceeding either returns 429 with a Retry-After header. Wait that many seconds before retrying; retrying sooner just burns quota.

Errors

Errors return the matching HTTP status and a JSON body of the form {"detail": "..."}.

StatusMeaning
400A parameter was invalid, for example an unknown sort key.
401Key missing, malformed, revoked, or the account is no longer Pro.
404No addon with that id.
422A parameter was the wrong type or out of range, for example limit=500.
429Rate limit exceeded. See Retry-After.

Pagination

List endpoints take limit (default 50, max 200) and offset, and return a pagination object alongside the data.

{
  "data": [ ... ],
  "pagination": {
    "total": 7527,      # rows matching the filter, not just this page
    "limit": 50,
    "offset": 0,
    "returned": 50,
    "has_more": true
  }
}

Walk a full result set by increasing offset by limit until has_more is false.

Verify a key

GET/api/v1/me

Confirms a key works and reports the quota attached to it. The cheapest way to test your setup.

{
  "email": "you@example.com",
  "tier": "pro",
  "key_prefix": "ai_live_8fJ2xQ",
  "key_created_at": "2026-08-28T10:12:03+00:00",
  "rate_limit": { "per_minute": 60, "per_day": 10000 }
}

List addons

GET/api/v1/addons

Ranked addons, highest opportunity first by default.

ParameterDescription
searchSubstring match on addon or developer name. Case-insensitive; % and _ are treated literally.
categoryCategory slug, for example business-tools/sales-and-crm. See list categories.
min_opportunityOnly addons scoring at or above this value (0–100).
sortOne of installs, name, opportunity, rating, reviews. Default opportunity.
orderasc or desc. Default desc.
limit1–200. Default 50.
offsetRows to skip. Default 0.
curl "http://addonintel.com/api/v1/addons?min_opportunity=60&limit=2" \
  -H "Authorization: Bearer $ADDONINTEL_KEY"

{
  "data": [
    {
      "id": "266631577044",
      "name": "Example Addon",
      "developer": "Example Ltd",
      "url": "https://workspace.google.com/marketplace/app/...",
      "categories": ["productivity", "works-with-doc"],
      "rating": 4.1,
      "rating_count": 1220,
      "review_count": 88,
      "installs": 500000,
      "pricing": "Free of charge",
      "opportunity": 72.4,
      "verdict": "strong",
      "short_description": "Lets you find and replace text with formatting in Docs™."
    }
  ],
  "pagination": { "total": 812, "limit": 2, "offset": 0, "returned": 2, "has_more": true }
}

Get an addon

GET/api/v1/addons/{id}

One addon with the full score breakdown. Adds components, top_themes, long_description, pricing_text, is_paid, has_free_tier, works_with, last_updated and scored_at to the fields above. long_description is detail-only: it runs to thousands of characters, so a page of 200 would be an enormous response.

{
  "id": "266631577044",
  "name": "Example Addon",
  "opportunity": 72.4,
  "verdict": "strong",
  "components": {
    "demand": 0.81, "dissatisfaction": 0.62, "attackable": 0.55,
    "decay": 0.30, "neglect": 0.44, "monetized": 0.20,
    "major_vendor_penalty": 0.0, "n_reviews": 88
  },
  "top_themes": [ { "theme": "sync failures", "count": 19 } ],
  "scored_at": "2026-08-28T03:14:00+00:00"
}

Get reviews

GET/api/v1/addons/{id}/reviews

The written reviews we hold for one addon, newest first. Pass negative_only=true for those rated 3 or below.

{
  "data": [
    {
      "id": 90412,
      "rating": 2,
      "author": "A. Reviewer",
      "body": "Stopped syncing after the last update.",
      "posted_at": "2026-07-19T00:00:00+00:00",
      "developer_replied": false,
      "sentiment": -0.62,
      "sentiment_label": "negative",
      "themes": ["sync failures"],
      "feature_request": null
    }
  ],
  "pagination": { "total": 88, "limit": 50, "offset": 0, "returned": 50, "has_more": true }
}

Reviews are not ratings. Most people leave a star rating without writing anything, so review_count is far smaller than rating_count. We collect English-language reviews; a review_count of null means the review pass has not reached that addon yet, which is not the same as zero.

List categories

GET/api/v1/categories

Category aggregates, the same figures behind the categories page. Use slug to filter list addons.

components holds the mean of each scoring component across the shelf. The composite score says how soft a category is; these say in what way. A shelf high on neglect is one whose developers have stopped updating and stopped answering reviews; one high on dissatisfaction has maintained addons that users still dislike. Those are different openings.

{
  "data": [
    {
      "slug": "business-tools/sales-and-crm",
      "name": "Sales & CRM",
      "url": "https://workspace.google.com/marketplace/category/business-tools/sales-and-crm",
      "addons": 443,
      "mean_rating": 4.31,
      "healthy_leaders": 61,
      "mean_opportunity": 48.2,
      "best_opportunity": 91.7,
      "scored_addons": 443,
      "components": {
        "demand": 0.712, "dissatisfaction": 0.401, "attackable": 0.55,
        "decay": 0.298, "neglect": 0.556, "monetized": 0.24
      }
    }
  ]
}

Field meanings

FieldMeaning
opportunityThe gap score, 0–100. Higher means a better opening: real demand, unhappy users, and a leader that looks attackable.
verdictA plain-language read of the score, for example strong, major vendor, healthy leader.
componentsThe weighted parts behind the score. n_reviews is how many reviews backed it — a low count means a less confident score.
rating_countStar ratings, including the many left with no written text.
review_countWritten reviews the listing reports. null means not yet determined, not zero.
installsInstall count as reported by the marketplace, which rounds heavily at the top end.
categoriesMarketplace category slugs. Addons usually carry several, so categories overlap.
short_descriptionThe one-line tagline shown under the addon name on the marketplace.
long_descriptionThe full write-up from the listing, capped at 20,000 characters. Detail endpoint only.

Versioning

Endpoints live under /api/v1/. We may add fields to a response without warning, so parse defensively and ignore what you do not recognise. Removing or renaming anything means a new version path.

Create an account →