Plugins
Browse the plugin marketplace, download plugins, publish versions from your own scripts, set prices, and read your sales.
The plugin marketplace over the API. Reading it is open to anyone; with a key you can also publish from CI, set a plugin's price and follow its sales. How plugins are built is in the Plugin SDK.
| Endpoint | Scope | Plan |
|---|---|---|
GET /plugins, GET /plugins/:slug | plugins:read (or no key at all) | Any |
GET /plugins/mine, GET /plugins/:slug/package, GET /purchases | plugins:read | Downloading needs Pro or Ultimate |
POST /plugins, DELETE /plugins/:slug, PUT /plugins/:slug/price | plugins:write | Publishing needs Pro or Ultimate |
GET /sales | sales:read | Any |
A listing
Every list and detail answer describes plugins the same way:
{
"id": "5d0c…",
"slug": "giveaway-wheel",
"name": "Giveaway Wheel",
"description": "Spin a wheel of recent chatters for giveaways.",
"version": "2.0.0",
"permissions": ["chat.read", "ui.window"],
"publisher": { "kind": "user", "name": "StreamerSam", "verified": false },
"downloads": 95,
"homepage": null,
"createdAt": "2026-10-01T09:12:00.000Z",
"updatedAt": "2026-10-14T18:40:00.000Z",
"status": "published",
"mine": false,
"price": { "tier": "t2", "INR": 99, "USD": 2 },
"owned": false
}priceisnullfor a free plugin. A paid one costsINRrupees in India andUSDdollars everywhere else.ownedistruewhen the caller can install it: it's free, they bought it, or they made it.priceRequestappears only for the plugin's author: a price waiting for review ("status": "pending") or turned down ("rejected", with anote).
Browse the marketplace
/api/v1/pluginsplugins:readForgeCast's own plugins first, then the most downloaded. Works without a key too.
Name
Type
{ "items": [ /* listings */ ], "next": "bzoyNA" }/api/v1/plugins/:slugplugins:readOne plugin, with its versions (newest first: version, changelog, createdAt), as { "item": … }.
/api/v1/plugins/mineplugins:readThe plugins you published (hidden ones too), as { "items": […], "staff": false }.
Download a plugin
/api/v1/plugins/:slug/packageplugins:readThe latest version's files, ready to install. Counts one download a day per account.
{
"listingId": "5d0c…",
"id": "giveaway-wheel",
"version": "2.0.0",
"publisher": { "kind": "user", "name": "StreamerSam", "verified": false },
"files": [{ "path": "plugin.json", "content": "{ … }" }, { "path": "main.lua", "content": "…" }]
}A paid plugin the caller hasn't bought answers 403 purchase_required. Its details say what it costs and where to buy it, so your tool can send the person there:
{
"error": {
"code": "purchase_required",
"message": "\"Giveaway Wheel\" costs ₹99 ($2). Buy it on forgecast.in, then install it again.",
"details": { "price": { "tier": "t2", "INR": 99, "USD": 2 }, "buyUrl": "https://forgecast.in/marketplace/plugins/giveaway-wheel#buy" }
}
}Plugins are bought only on the website (Razorpay's checkout), never through the API.
Publish from your own scripts
/api/v1/pluginsplugins:writeThe same thing the app's Publish button does, so a CI job can publish each release. Send every file of the plugin's folder; the packing rules apply.
curl -s -X POST "$FORGECAST_URL/api/v1/plugins" \
-H "Authorization: Bearer $FORGECAST_KEY" \
-H "Content-Type: application/json" \
-d @- <<'JSON'
{
"files": [
{ "path": "plugin.json", "content": "{\"id\":\"giveaway-wheel\",\"name\":\"Giveaway Wheel\",\"version\":\"2.0.1\",\"main\":\"main.lua\",\"api\":1,\"permissions\":[\"chat.read\"]}" },
{ "path": "main.lua", "content": "log.info(\"hello\")" }
],
"changelog": "Fixes the wheel on small windows."
}
JSONAnswers 201. 400 invalid_package says what to fix; 409 slug_taken means someone else publishes that id, 409 version_exists that the version isn't higher than the published one. At most 10 publishes an hour.
/api/v1/plugins/:slugplugins:writeTakes your plugin out of the marketplace (204). People who have it keep their copy, and people who bought it keep it in their purchases.
Set a price
/api/v1/plugins/:slug/priceplugins:writePick a tier, or null to make it free. A new price waits for ForgeCast to review it (the plugin keeps its old price meanwhile); free takes effect at once. See Selling plugins for the rules.
| Tier | India | Elsewhere |
|---|---|---|
t1 | ₹49 | $1 |
t2 | ₹99 | $2 |
t3 | ₹199 | $3 |
t4 | ₹399 | $5 |
t5 | ₹799 | $10 |
curl -s -X PUT "$FORGECAST_URL/api/v1/plugins/giveaway-wheel/price" \
-H "Authorization: Bearer $FORGECAST_KEY" \
-H "Content-Type: application/json" \
-d '{"tier":"t2"}'{ "price": null, "priceRequest": { "tier": "t2", "status": "pending", "note": null, "requestedAt": "2026-10-18T10:00:00.000Z" } }Only the plugin's author can price it (403 otherwise).
Your purchases
/api/v1/purchasesplugins:readThe plugins you bought, newest first. Amounts are in paise or cents.
{ "items": [{ "slug": "giveaway-wheel", "name": "Giveaway Wheel", "currency": "INR", "amount": 9900, "status": "paid", "paidAt": "2026-10-18T10:05:00.000Z" }] }status is paid or refunded.
Your sales
/api/v1/salessales:readWhat your plugins earned, by currency, with the latest 100 sales and your payouts. Amounts are in paise or cents.
{
"earnings": [{ "currency": "INR", "earned": 20790, "held": 6930, "payable": 13860, "paidOut": 0, "minimum": 50000 }],
"sales": [{ "id": "…", "slug": "giveaway-wheel", "name": "Giveaway Wheel", "currency": "INR", "amount": 9900, "share": 6930, "status": "paid", "paidAt": "…", "payable": false, "paidOut": false }],
"payouts": [{ "id": "…", "currency": "INR", "amount": 50000, "method": "upi", "reference": "UTR123456789", "createdAt": "…" }]
}held: sales still inside the buyer's refund window.payable: past it and not paid out yet. It's paid once it reachesminimum.share: your part of that sale.

