Skip to content
ForgeCastDocs

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.

EndpointScopePlan
GET /plugins, GET /plugins/:slugplugins:read (or no key at all)Any
GET /plugins/mine, GET /plugins/:slug/package, GET /purchasesplugins:readDownloading needs Pro or Ultimate
POST /plugins, DELETE /plugins/:slug, PUT /plugins/:slug/priceplugins:writePublishing needs Pro or Ultimate
GET /salessales:readAny

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
}
  • price is null for a free plugin. A paid one costs INR rupees in India and USD dollars everywhere else.
  • owned is true when the caller can install it: it's free, they bought it, or they made it.
  • priceRequest appears only for the plugin's author: a price waiting for review ("status": "pending") or turned down ("rejected", with a note).

Browse the marketplace

GET/api/v1/pluginsplugins:read

ForgeCast's own plugins first, then the most downloaded. Works without a key too.

Name

Type

{ "items": [ /* listings */ ], "next": "bzoyNA" }
GET/api/v1/plugins/:slugplugins:read

One plugin, with its versions (newest first: version, changelog, createdAt), as { "item": … }.

GET/api/v1/plugins/mineplugins:read

The plugins you published (hidden ones too), as { "items": […], "staff": false }.

Download a plugin

GET/api/v1/plugins/:slug/packageplugins:read

The 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

POST/api/v1/pluginsplugins:write

The 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."
}
JSON

Answers 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.

DELETE/api/v1/plugins/:slugplugins:write

Takes 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

PUT/api/v1/plugins/:slug/priceplugins:write

Pick 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.

TierIndiaElsewhere
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

GET/api/v1/purchasesplugins:read

The 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

GET/api/v1/salessales:read

What 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 reaches minimum.
  • share: your part of that sale.

On this page