Plugin Store API

Programmatically query the Plugin Store database, fetch metadata, install plugins, setup autoloading, and manage local workspace files from your Luau scripts.

💡
All endpoints return static JSON payloads hosted on our CDN. Ensure your Roblox executor supports HTTP requests and standard file APIs (writefile, delfile, listfiles) to utilize the guides.

Base URL

https://iyplugins.pages.dev

All endpoints listed below are relative to this base URL.

Endpoints

Get All Plugins (Lightweight)

GET /data/api.json
Returns a lightweight list of all plugins with names, authors, dates, and file URLs. Recommended for in-game execution.

Get All Plugins (Full Data)

GET /data/plugins.json
Returns the full database including descriptions, reaction counts, embeds, and raw source code strings.

Download a Plugin File

GET /plugins/{id}/{filename}
Downloads the raw `.iy` plugin file content. The 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.

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

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

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

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

Luau Manager 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.