Skip to main content

Standard Response Format

All Zyrix API functions return a consistent tuple pattern:
local success, status, data = exports['zyrix_admin']:FunctionName(parameters)

Response Components

Success (Boolean)

Indicates whether the operation completed successfully:
local success, status = exports['zyrix_admin']:TeleportPlayer(staffId, targetId, coords)

if success then
    print("Operation completed successfully")
else
    print("Operation failed:", status)
end

Status (String)

Provides specific information about the operation result:

Success Status Codes

  • 'success' - Operation completed successfully
  • 'completed' - Alternative success indicator for some functions

Error Status Codes

  • 'no_permission' - Staff member lacks required permissions
  • 'invalid_staff' - Invalid staff ID or staff member not found
  • 'invalid_target' - Invalid target player ID
  • 'player_not_found' - Target player is not online
  • 'player_not_connected' - Player has disconnected
  • 'insufficient_rank' - Staff rank too low for action
  • 'already_banned' - Player is already banned (ban functions)
  • 'not_banned' - Player is not banned (unban functions)
  • 'invalid_duration' - Invalid time duration specified
  • 'rate_limited' - Action blocked due to rate limiting
  • 'system_error' - Internal system error occurred

Data (Optional)

Some functions return additional data as the third parameter:
local success, status, warnings = exports['zyrix_admin']:FetchWarnings(targetId)

if success then
    print(string.format("Player has %d warnings", #warnings))
    for i, warning in ipairs(warnings) do
        print(string.format("Warning %d: %s", i, warning.reason))
    end
end

Response Examples

Simple Success Response

local success, status = exports['zyrix_admin']:HealPlayer(staffId, targetId)
-- Returns: true, 'success'

Error Response

local success, status = exports['zyrix_admin']:BanPlayer(staffId, 999, 3600, "Cheating")
-- Returns: false, 'player_not_found'

Response with Data

local success, status, screenshot = exports['zyrix_admin']:TakeScreenshot(staffId, targetId)
-- Returns: true, 'success', {url = 'https://...', timestamp = 1234567890}

Best Practices

1. Always Check Success Status

Never assume an operation succeeded without checking:
local success, status = exports['zyrix_admin']:KickPlayer(staffId, targetId, reason)

if not success then
    print("Kick failed:", status)
    return
end

print("Player kicked successfully")

2. Handle Specific Error Cases

Provide appropriate responses for different error scenarios:
local success, status = exports['zyrix_admin']:TeleportPlayer(staffId, targetId, coords)

if not success then
    if status == 'no_permission' then
        TriggerClientEvent('notification', staffId, 'You cannot teleport players')
    elseif status == 'player_not_found' then
        TriggerClientEvent('notification', staffId, 'Player not found')
    else
        TriggerClientEvent('notification', staffId, 'Teleport failed: ' .. status)
    end
    return
end

TriggerClientEvent('notification', staffId, 'Player teleported successfully')

3. Use Data When Available

Extract and use returned data appropriately:
local success, status, playerData = exports['zyrix_admin']:GetPlayerInfo(targetId)

if success and playerData then
    print(string.format("Player: %s (ID: %d)", playerData.name, playerData.id))
    print(string.format("Warnings: %d | Bans: %d", playerData.warnings, playerData.bans))
end

Function-Specific Patterns

Moderation Functions

-- Standard moderation response
local success, status = exports['zyrix_admin']:WarnPlayer(staffId, targetId, reason)
-- Returns: boolean success, string status

Data Retrieval Functions

-- Functions that return data
local success, status, data = exports['zyrix_admin']:FetchWarnings(targetId)
-- Returns: boolean success, string status, table data

Toggle Functions

-- Functions with toggle behavior
local success, status, newState = exports['zyrix_admin']:FreezePlayer(staffId, targetId)
-- Returns: boolean success, string status, boolean newState
Consistent response patterns make it easier to build robust integrations. Always handle both success and error cases in your code.