Programmatic access to every scored addon, its review analysis, and the category aggregates. Included with Pro.
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.
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:
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 return the matching HTTP status and a JSON body of the form {"detail": "..."}.
| Status | Meaning |
|---|---|
| 400 | A parameter was invalid, for example an unknown sort key. |
| 401 | Key missing, malformed, revoked, or the account is no longer Pro. |
| 404 | No addon with that id. |
| 422 | A parameter was the wrong type or out of range, for example limit=500. |
| 429 | Rate limit exceeded. See Retry-After. |
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.
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 }
}
Ranked addons, highest opportunity first by default.
| Parameter | Description |
|---|---|
| search | Substring match on addon or developer name. Case-insensitive; % and _ are treated literally. |
| category | Category slug, for example business-tools/sales-and-crm. See list categories. |
| min_opportunity | Only addons scoring at or above this value (0–100). |
| sort | One of installs, name, opportunity, rating, reviews. Default opportunity. |
| order | asc or desc. Default desc. |
| limit | 1–200. Default 50. |
| offset | Rows 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 }
}
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"
}
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.
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 | Meaning |
|---|---|
| opportunity | The gap score, 0–100. Higher means a better opening: real demand, unhappy users, and a leader that looks attackable. |
| verdict | A plain-language read of the score, for example strong, major vendor, healthy leader. |
| components | The weighted parts behind the score. n_reviews is how many reviews backed it — a low count means a less confident score. |
| rating_count | Star ratings, including the many left with no written text. |
| review_count | Written reviews the listing reports. null means not yet determined, not zero. |
| installs | Install count as reported by the marketplace, which rounds heavily at the top end. |
| categories | Marketplace category slugs. Addons usually carry several, so categories overlap. |
| short_description | The one-line tagline shown under the addon name on the marketplace. |
| long_description | The full write-up from the listing, capped at 20,000 characters. Detail endpoint only. |
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.