Addons API
Curated packs that bundle several plugins into one themed install — a zombie server, a match server, an admin toolkit.
Overview #
An addon pack is an ordered, curated list of plugins from the
plugin directory. There is no separate download for a pack: the detail
response hands you an install_url per bundled plugin, and you install each one exactly as you
would a standalone plugin.
| GET | /v1/addons | Paginated list of published packs |
| GET | /v1/addons/{slug} | One pack plus its bundled plugins |
Packs stay current automatically: install_url always points at each plugin's
latest published version at the moment you read it. Cache the plugin files, not the pack
response.
List addon packs #
/v1/addons
addons:read
auth optional
Published packs, sorted by all-time downloads descending. There is no search or category filter here — the pack catalogue is small enough to fetch whole.
Parameters
page_n
integer
default 1
1-based page number, clamped to 1–100000.
per_page
integer
default 24
Items per page, clamped to 1–100.
Response fields
| Field | Type | Notes |
|---|---|---|
plugin_count |
integer | Number of plugins in the pack, as curated. The detail response may list fewer if a bundled plugin has since been unpublished. |
downloads |
integer | All-time pack downloads. |
detail_url / page_url |
string | API detail URL and the human-facing page. |
A brand-new install has no published packs — an empty
"addons": [] with "total": 0 is a perfectly normal 200. Handle it.
curl "https://api.counter-strike-boost.com/v1/addons?per_page=2"const res = await fetch(
"https://api.counter-strike-boost.com/v1/addons?per_page=2"
);
const data = await res.json();
if (!data.status) {
throw new Error(data.error); // stable machine-readable code
}<?php
$body = file_get_contents(
"https://api.counter-strike-boost.com/v1/addons?per_page=2"
);
$data = json_decode($body, true);
if (empty($data['status'])) {
throw new RuntimeException($data['error'] ?? 'request_failed');
}import requests
r = requests.get(
"https://api.counter-strike-boost.com/v1/addons?per_page=2",
timeout=30,
)
r.raise_for_status()
data = r.json(){
"addons": [
{
"created_at": "2026-07-18 11:04:31",
"description": "Everything a public 24/7 server needs on day one: admin menu, ban manager, adverts and anti-cheat.",
"detail_url": "https://api.counter-strike-boost.com/v1/addons/essential-server-pack",
"downloads": 512,
"name": "Essential Server Pack",
"page_url": "https://counter-strike-boost.com/addons/essential-server-pack",
"plugin_count": 6,
"slug": "essential-server-pack"
}
],
"page": 1,
"per_page": 2,
"status": true,
"total": 1,
"total_pages": 1
}Get an addon pack #
/v1/addons/{slug}
addons:read
auth optional
The pack plus its bundled plugins in curation order. Each plugin arrives with its latest
version resolved and an install_url you can hand straight to a downloader — no second
round-trip to /v1/plugins/{slug} needed.
Parameters
slug
string
path
required
Pack slug, e.g. essential-server-pack.
Response fields
| Field | Type | Notes |
|---|---|---|
plugins |
object[] | In curation order — the pack author decided it, so install in this order. |
plugins[].install_url |
string | Pre-built download URL for the plugin's latest version, kind=amxx. Empty string if that plugin currently has no published version — skip those rather than requesting an empty URL. |
plugins[].latest_version |
string | Resolved at read time. Want a different kind? Rebuild the URL from slug + this version. |
A bundled plugin that has been unpublished simply disappears from plugins, while
plugin_count keeps the curated number. If the two disagree, trust the array — it is what you can
actually install. Iterating over plugins and skipping empty install_url values is
always correct.
curl "https://api.counter-strike-boost.com/v1/addons/essential-server-pack"const res = await fetch(
"https://api.counter-strike-boost.com/v1/addons/essential-server-pack"
);
const data = await res.json();
if (!data.status) {
throw new Error(data.error); // stable machine-readable code
}<?php
$body = file_get_contents(
"https://api.counter-strike-boost.com/v1/addons/essential-server-pack"
);
$data = json_decode($body, true);
if (empty($data['status'])) {
throw new RuntimeException($data['error'] ?? 'request_failed');
}import requests
r = requests.get(
"https://api.counter-strike-boost.com/v1/addons/essential-server-pack",
timeout=30,
)
r.raise_for_status()
data = r.json(){
"addon": {
"created_at": "2026-07-18 11:04:31",
"description": "Everything a public 24/7 server needs on day one.",
"downloads": 512,
"name": "Essential Server Pack",
"page_url": "https://counter-strike-boost.com/addons/essential-server-pack",
"plugin_count": 6,
"plugins": [
{
"category": "admin",
"detail_url": "https://api.counter-strike-boost.com/v1/plugins/csb-admin-menu",
"install_url": "https://api.counter-strike-boost.com/v1/plugins/csb-admin-menu/download/1.0.0?kind=amxx",
"latest_version": "1.0.0",
"name": "CSB Admin Menu",
"rating": { "avg": 4.6, "count": 23 },
"slug": "csb-admin-menu"
},
{
"category": "hud-info",
"detail_url": "https://api.counter-strike-boost.com/v1/plugins/csb-server-adverts",
"install_url": "https://api.counter-strike-boost.com/v1/plugins/csb-server-adverts/download/1.0.0?kind=amxx",
"latest_version": "1.0.0",
"name": "CSB Server Adverts",
"rating": { "avg": 0, "count": 0 },
"slug": "csb-server-adverts"
}
],
"slug": "essential-server-pack"
},
"status": true
}{
"error": "not_found",
"status": false
}Recipe: install a whole pack #
Read the pack, then fetch each plugin in order. Every bundled plugin also needs a line in
plugins.ini, so keep the filenames as you go.
SLUG=essential-server-pack
curl -s "https://api.counter-strike-boost.com/v1/addons/$SLUG" \
| jq -r '.addon.plugins[] | select(.install_url != "") | .install_url' \
| while read -r url; do curl -OJ "$url"; doneconst API = 'https://api.counter-strike-boost.com';
const res = await fetch(`${API}/v1/addons/essential-server-pack`);
const { addon } = await res.json();
for (const plugin of addon.plugins) {
// A plugin with no published version has an empty install_url.
if (!plugin.install_url) continue;
const file = await fetch(plugin.install_url);
if (!file.ok) {
const err = await file.json(); // { status:false, error:"..." }
console.warn(`skip ${plugin.slug}: ${err.error}`);
continue;
}
await writeFile(
`cstrike/addons/amxmodx/plugins/${plugin.slug}-${plugin.latest_version}.amxx`,
Buffer.from(await file.arrayBuffer())
);
}Each of those downloads compiles a plugin, so a six-plugin pack costs six units of your hourly compile budget. Pace bulk installs, or use a key.









