A read-only REST API for the plugins listed on the Logi Marketplace. Search, filter by platform or category, and get full plugin details as clean JSON. You don't need an API key.
How it works
This service sits between your app and the marketplace. It fetches the marketplace data, cleans it up, and serves it through a small, stable API.
Your app
Sends a normal HTTP GET request, with optional filters in the query string.
This API
Checks your input, filters and pages the results, and keeps marketplace data cached for 30 minutes.
Logi Marketplace
The original source. It's only contacted when the cache is empty or expired.
Fast
Most requests come straight from the cache, without waiting on the marketplace.
Clean data
Plugin fields are flattened into a consistent shape, including platforms and download counts.
Versioned
Every URL starts with /v1, so future breaking changes won't affect your integration.
Endpoints
Both endpoints return JSON. Send Accept: application/json so errors come back as JSON too.
/api/v1/plugins
Lists plugins, one page at a time. All query parameters are optional and can be combined.
| Parameter | Type | Description |
|---|---|---|
search | string | Matches the plugin name or display name. Case-insensitive, up to 100 characters. |
platform | string | Only plugins for this platform, for example Windows or MacOS. |
category | string | Only plugins in this category, for example Gaming. |
page | integer | Page number, starting at 1. Default: 1. |
per_page | integer | Results per page, from 1 to 100. Default: 25. |
Example request
curl "https://logiplugin.com/api/v1/plugins?search=dice&category=Gaming"
Example response (the meta.links array is left out)
{
"data": [
{
"id": 4942,
"name": "Dice",
"displayName": "Dice",
"description": "Allows quick virtual dice rolling.",
"categories": ["Gaming"],
"icon": "https://marketplace.logi.com/resources/16/Dice_65255eb975.png",
"versions": ["1.2.1"],
"platforms": ["MacOS", "Windows"],
"firstPublicAt": "2025-10-06T17:04:48.177Z",
"downloads": 8352
}
],
"links": {
"first": "https://logiplugin.com/api/v1/plugins?search=dice&category=Gaming&page=1",
"last": "https://logiplugin.com/api/v1/plugins?search=dice&category=Gaming&page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"path": "https://logiplugin.com/api/v1/plugins",
"per_page": 25,
"to": 1,
"total": 1
}
}
/api/v1/plugins/{name}
Returns one plugin, looked up by its name (not the display name).
It has all the list fields plus author, links, requirements, and the full version history
(here versions is a list of objects instead of version numbers).
Example request
curl "https://logiplugin.com/api/v1/plugins/Dice"
Example response
{
"data": {
"id": 4942,
"name": "Dice",
"displayName": "Dice",
"description": "Allows quick virtual dice rolling.",
"categories": ["Gaming"],
"icon": "https://marketplace.logi.com/resources/16/Dice_65255eb975.png",
"versions": [
{
"version": "1.2.1",
"fileUrl": "https://marketplace.logi.com/resources/16/Dice_1_2_1_33fbfc1963.lplug4",
"minLPSVersion": "6",
"platforms": ["MacOS", "Windows"]
}
],
"platforms": ["MacOS", "Windows"],
"firstPublicAt": "2025-10-06T17:04:48.177Z",
"downloads": 8352,
"author": { "name": "KBrandt.dev", "supportUrl": "" },
"homeUrl": "",
"requirements": [],
"capabilities": [],
"supportedFeatures": []
}
}
Caching & errors
What to expect when responses are reused, and how errors look.
Caching
| Server cache | Marketplace data is kept for 30 minutes, so new plugins can take that long to show up. |
| Your cache | Successful responses send Cache-Control: public, max-age=300, so you can reuse them for 5 minutes. |
| ETag | Send the ETag back as If-None-Match and you'll get 304 Not Modified if nothing changed. |
Status codes
| 200 | Success. |
| 304 | Not modified. Use your cached copy. |
| 404 | No plugin with that name, or an unknown URL. |
| 405 | Wrong method. Only GET and HEAD are allowed. |
| 422 | A query parameter is invalid. See errors. |
| 502 | The marketplace couldn't be reached. Try again later. |
Every error has a message. Invalid input also includes errors.
{
"message": "The per page field must not be greater than 100.",
"errors": {
"per_page": ["The per page field must not be greater than 100."]
}
}