Skip to content

Registry API

The semrel-registry exposes a JSON REST API for discovering, managing, and downloading semrel plugins. The base URL is configurable — for the official registry use https://registry.semrel.io.

Initiates GitHub OAuth login. Redirects the browser to GitHub for authorisation.

OAuth callback — exchanges the GitHub code for a JWT and redirects back to the configured frontend URL.

Returns OAuth application configuration for the frontend.

Response

{
"clientId": "Ov23liXXXXXX",
"callbackUrl": "https://registry.semrel.io/auth/github/callback"
}

GET /api/v1/auth/me Requires Auth

Section titled “GET /api/v1/auth/me ”

Returns the authenticated user profile.

Response

{
"login": "mwaldheim",
"name": "Markus Waldheim",
"avatarUrl": "https://avatars.githubusercontent.com/...",
"isAdmin": false
}

Lists plugins with pagination and filtering.

Query parameters

ParameterTypeDefaultDescription
pageinteger1Page number
limitinteger20Results per page (max 100)
categorystringFilter by category (analyzer, generator, provider, condition, hook, updater)
authorstringFilter by GitHub login
searchstringFull-text search across name, description, and tags
statusstringactiveStatus filter (admins only: pending, rejected)

Response

{
"plugins": [
{
"id": 1,
"namespace": "@semrel",
"name": "provider-github",
"description": "Publishes GitHub releases and uploads assets.",
"author": "mwaldheim",
"category": "provider",
"repository": "https://github.com/SemRels/provider-github",
"license": "MIT",
"status": "active",
"tags": ["github", "release"],
"latestVersion": "1.2.0",
"views": 1240,
"downloads": 4891,
"createdAt": "2024-01-15T10:00:00Z",
"updatedAt": "2024-03-20T14:30:00Z"
}
],
"total": 42,
"page": 1,
"limit": 20
}

Returns a single plugin by its numeric ID.

Returns a plugin by namespace and name (e.g. GET /api/v1/plugins/@semrel/provider-github).

Lists all published versions of a plugin.

Response

[
{
"id": 7,
"pluginId": 1,
"version": "1.2.0",
"changelog": "## 1.2.0\n\n- Added asset upload support",
"downloadUrl": "https://github.com/SemRels/provider-github/releases/download/v1.2.0/provider-github-linux-amd64",
"checksums": {
"linux/amd64": "sha256:abc123..."
},
"prerelease": false,
"downloads": 1240,
"createdAt": "2024-03-20T14:30:00Z"
}
]

GET /api/v1/plugins/:id/versions/:version/download

Section titled “GET /api/v1/plugins/:id/versions/:version/download”

Records a download event and returns a redirect to the binary download URL.


Plugin management Requires Auth

Section titled “Plugin management ”

Submits a plugin for community review. The plugin is created with status: pending until an admin approves it.

Request body

{
"name": "my-custom-analyzer",
"description": "A custom commit analyzer.",
"author": "mwaldheim",
"category": "analyzer",
"repository": "https://github.com/mwaldheim/my-custom-analyzer",
"license": "MIT",
"tags": ["analyzer", "custom"]
}

Validates a plugin specification against the official plugin standards.

Creates a plugin directly (requires auth). Use submit for community plugins.

Updates plugin metadata.

Deletes a plugin.


Admin endpoints Admin only

Section titled “Admin endpoints ”

Returns registry-wide statistics.

Response

{
"totalPlugins": 42,
"totalDownloads": 98234,
"totalVersions": 156,
"categories": {
"analyzer": 8,
"generator": 6,
"provider": 5,
"condition": 10,
"hook": 7,
"updater": 6
}
}

Triggers a synchronisation from the configured PLUGINS_JSON_PATH file.

Syncs all plugin repositories from a GitHub organisation.

Approves a pending community plugin submission.

Rejects a community plugin submission.


Returns the JSON Schema for the .semrel.yaml configuration file. Use with editor tooling for inline validation.

.semrel.yaml
# yaml-language-server: $schema=https://registry.semrel.io/schemas/core/v1.json
tagPrefix: "v"

Returns the JSON Schema for a specific plugin’s configuration.

Redirects (301) to the latest schema version for the named plugin.


Receives repository_dispatch events from plugin release workflows to automatically register new plugin versions. Protected by WEBHOOK_SECRET.


Public endpoints are rate-limited per client IP:

Endpoint groupLimit
Plugin read endpoints60 req/min
/plugins.json10 req/min
OAuth endpoints20 req/min

Responses exceeding the limit return HTTP 429 Too Many Requests with a Retry-After: 60 header.


Returns the full plugin catalogue as a flat JSON array — this is the endpoint consumed by the semrel CLI when SEMREL_REGISTRY_URL is set.

[
{
"name": "provider-github",
"namespace": "@semrel",
"description": "Publishes GitHub releases and uploads assets.",
"repository": "https://github.com/SemRels/provider-github",
"category": "provider",
"latestVersion": "1.2.0"
}
]