Plugin Store API
Programmatically query the Plugin Store database, fetch metadata, install plugins, setup autoloading, and manage local workspace files from your Luau scripts.
writefile, delfile, listfiles) to utilize the guides.
Base URL
All endpoints listed below are relative to this base URL.
Endpoints
Get All Plugins (Lightweight)
Get All Plugins (Full Data)
Download a Plugin File
id and filename are retrieved from the plugin's payload.Response Schema (api.json)
| Field | Type | Description |
|---|---|---|
version |
string | API format version |
updated_at |
string | ISO 8601 timestamp of the last update |
total |
number | Total number of active plugins |
plugins[] |
array | Array of plugin entries |
plugins[].id |
string | Unique plugin identification string |
plugins[].name |
string | Plugin display name |
plugins[].author |
string | Author display name |
plugins[].date |
string | ISO 8601 upload timestamp |
plugins[].files[] |
array | Array of plugin asset files |
plugins[].files[].filename |
string | The name of the file (e.g. "fly.iy") |
plugins[].files[].url |
string | Relative download path |
plugins[].files[].size |
number | File size in bytes |
Fetching & Parsing
Interact with the lightweight database by executing HTTP requests inside Roblox Luau and decoding the JSON output. Wrap requests in a pcall to catch network drops.
local HttpService = game:GetService("HttpService")
local BASE_URL = "https://iyplugins.pages.dev"
local function fetchDatabase()
local success, response = pcall(function()
return game:HttpGet(BASE_URL .. "/data/api.json")
end)
if success then
local data = HttpService:JSONDecode(response)
return data.plugins or {}
end
warn("Failed to retrieve the Plugin Store database.")
return nil
end
local plugins = fetchDatabase()
if plugins then
print("Loaded " .. #plugins .. " plugins from API.")
end
Installing Plugins
To load a plugin into Infinite Yield, download its raw file and write it to the executor's workspace directory. Use the global addPlugin registry helper to register it immediately.
local BASE_URL = "https://iyplugins.pages.dev"
local function installPlugin(pluginObj)
if not writefile then
warn("Your executor does not support writefile.")
return false
end
local file = pluginObj.files and pluginObj.files[1]
if not file then return false end
local downloadUrl = BASE_URL .. "/" .. file.url
local success, content = pcall(function()
return game:HttpGet(downloadUrl)
end)
if success then
writefile(file.filename, content)
-- Register with Infinite Yield runtime
local addFn = addPlugin or (shared and shared.addPlugin)
if addFn then
pcall(function() addFn(file.filename) end)
end
return true
end
return false
end
Autoloading System
Autoload scans the workspace for files ending in `.iy` and registers them with Infinite Yield dynamically. This matches the official initialization workflow.
local function autoloadPlugins()
if not listfiles or not isfolder then
warn("Required file system operations are unsupported.")
return
end
local addFn = addPlugin or (shared and shared.addPlugin)
if not addFn then return end
for _, filePath in ipairs(listfiles("")) do
local fileName = filePath:match("([^/\\]+%.iy)$")
if fileName and
fileName:lower() ~= "iy_fe.iy" and
not isfolder(fileName) and
not table.find(PluginsTable or {}, fileName)
then
pcall(function()
addFn(fileName)
end)
end
end
end
Deleting Plugins
To clean up local assets, unregister the command hooks inside Infinite Yield and remove the file from the workspace filesystem using delfile.
local function deletePluginFile(pluginObj)
if not delfile then
warn("Your executor does not support deleting files.")
return false
end
local file = pluginObj.files and pluginObj.files[1]
if not file then return false end
-- Unregister from active IY session hooks
local deleteFn = deletePlugin or (shared and shared.deletePlugin)
if deleteFn then
pcall(function()
deleteFn(file.filename)
end)
end
-- Remove from local disk
local success = pcall(function()
delfile(file.filename)
end)
return success
end
Advanced Manager Loader
This OOP module aggregates fetching, loading, local filesystem synchronization, auto-loading, and cleanup operations into a single class.
local HttpService = game:GetService("HttpService")
local BASE_URL = "https://iyplugins.pages.dev"
local PluginManager = {}
PluginManager.__index = PluginManager
function PluginManager.new()
local self = setmetatable({}, PluginManager)
self.plugins = {}
return self
end
function PluginManager:loadStore()
local success, response = pcall(function()
return game:HttpGet(BASE_URL .. "/data/api.json")
end)
if success then
local data = HttpService:JSONDecode(response)
self.plugins = data.plugins or {}
return true
end
return false
end
function PluginManager:install(pluginId)
local target = nil
for _, p in ipairs(self.plugins) do
if p.id == pluginId then
target = p
break
end
end
if not target then return false, "Plugin ID not found." end
local file = target.files and target.files[1]
if not file then return false, "No file payload." end
local success, content = pcall(function()
return game:HttpGet(BASE_URL .. "/" .. file.url)
end)
if not success then return false, "Download failed." end
if writefile then
writefile(file.filename, content)
else
return false, "writefile is unsupported."
end
local addFn = addPlugin or (shared and shared.addPlugin)
if addFn then
pcall(function() addFn(file.filename) end)
end
return true, "Successfully installed."
end
function PluginManager:uninstall(pluginId)
local target = nil
for _, p in ipairs(self.plugins) do
if p.id == pluginId then
target = p
break
end
end
if not target then return false, "Plugin ID not found." end
local file = target.files and target.files[1]
if not file then return false, "No file payload." end
local deleteFn = deletePlugin or (shared and shared.deletePlugin)
if deleteFn then
pcall(function() deleteFn(file.filename) end)
end
if delfile then
local success = pcall(function() delfile(file.filename) end)
return success, success and "Deleted local file." or "Failed to delete file."
end
return false, "delfile is unsupported."
end
function PluginManager:autoload()
if not listfiles or not isfolder then return end
local addFn = addPlugin or (shared and shared.addPlugin)
if not addFn then return end
for _, filePath in ipairs(listfiles("")) do
local fileName = filePath:match("([^/\\]+%.iy)$")
if fileName and
fileName:lower() ~= "iy_fe.iy" and
not isfolder(fileName) and
not table.find(PluginsTable or {}, fileName)
then
pcall(function() addFn(fileName) end)
end
end
end
return PluginManager
FAQ
How often is the data updated?
The plugin database is updated manually upon code submissions. Refer to the updated_at field in the response header metadata to audit cache validity.
What is the difference between api.json and plugins.json?
api.json contains only lightweight indexing parameters (IDs, file paths, size in bytes) to decrease resource strain inside running Roblox clients. plugins.json includes descriptive metadata, icons, embedded attachments, and raw source strings for web scraping.
Plugins