Blixye API
Documentacion completa de la API de Blixye (SkyWings RP). Todas las rutas aceptan GET y POST. Las rutas legacy .php funcionan como alias.
Base URL: https://api.blixye.com
Autenticacion
La mayoria de endpoints requieren un apikey valido. Se envia como parametro en el body o query string.
| Metodo | Descripcion | Donde se usa |
|---|---|---|
apikey | API key del usuario (sk_...). Se obtiene al vincular Roblox. | Todos los endpoints de servidor |
X-MDT-Internal-Key | Header con la clave interna del servidor. Para endpoints bot-to-API. | /users (internal), /server_bot |
Formato apikey: /^sk_[A-Za-z0-9_]{20,80}$/
Errores globales
Todas las respuestas error siguen el formato:
{
"ok": false,
"error": "Mensaje en espanol",
"error_code": "codigo_en_ingles"
}
Los error_code se inyectan automaticamente por el middleware. Son consistentes en toda la API.
Codigos HTTP comunes
| Codigo | Significado |
|---|---|
200 | OK |
201 | Creado |
400 | Parametros invalidos o validacion fallida |
401 | API key invalida o no proporcionada |
403 | Sin permisos (rol insuficiente) |
404 | Recurso no encontrado |
409 | Conflicto (ya existe, duplicado) |
423 | Bloqueado (PIN locked) |
429 | Rate limit excedido |
Error Codes
Tabla completa de error_code que el middleware inyecta automaticamente:
| error_code | Significado |
|---|---|
| insufficient_balance | Saldo insuficiente (banco o wallet) |
| last_card | No puedes eliminar la ultima tarjeta |
| max_cards | Limite de tarjetas alcanzado |
| card_not_found | Tarjeta no encontrada |
| card_disabled | Tarjeta desactivada o invalida |
| card_expired | Tarjeta expirada o archivada |
| card_type_not_allowed | Tipo de tarjeta no permitido en este server |
| already_exists | Ya existe (cuenta, recurso duplicado) |
| limit_exceeded | Limite maximo excedido |
| account_not_found | Cuenta bancaria no encontrada |
| account_disabled | Cuenta no activa (congelada) |
| account_closed | Cuenta cerrada |
| main_account_readonly | La cuenta principal no puede modificarse/cerrarse |
| balance_not_zero | La cuenta debe tener saldo 0 para cerrar |
| cannot_remove_owner | No puedes eliminar/cambiar permisos del dueno |
| member_not_found | No es miembro de la cuenta |
| already_member | Ya es miembro |
| self_transfer | No puedes transferir a la misma cuenta/persona |
| pin_locked | PIN bloqueado por intentos fallidos |
| invalid_pin | PIN incorrecto o formato invalido |
| no_pin_set | No tiene PIN configurado |
| pin_required | Se requiere PIN para esta operacion |
| invalid_cvv | CVV incorrecto o no proporcionado |
| debt_not_found | Deuda no encontrada |
| not_signed | Deuda no firmada |
| already_paid | Ya pagada |
| already_cancelled | Ya cancelada |
| already_signed | Ya firmada |
| loan_not_found | Prestamo no encontrado |
| already_processed | Ya procesado (prestamo/solicitud) |
| request_not_found | Solicitud de pago no encontrada |
| expired | Expirado |
| destination_not_found | Destino no encontrado (personaje/titular) |
| character_not_found | Personaje no encontrado |
| no_bank_account | No tiene cuenta bancaria |
| invalid_amount | Cantidad invalida |
| forbidden | Sin permisos |
| not_found | No encontrado (generico) |
| error | Error no categorizado |
Rate Limits
| Grupo | Limite | Rutas |
|---|---|---|
| Users / OAuth | 30/min | /users |
| Servers / Game | 300/min | Todos los /server_* |
| Bot (internal) | 180/min | /server_bot |
Users — OAuth
Ruta: POST /users (alias: /users.php). Parametro de accion: action.
Inicia el flujo OAuth de Roblox. Tras autorizar, el navegador vuelve a http://127.0.0.1:<loopback_port>/blixye-oauth?code=… y la app remata con check_oauth_status + finish.
Parametros
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
loopback_port | int | Si | Puerto de 127.0.0.1 donde la app espera la vuelta del navegador (RFC 8252). Sin el: 426 update_required |
Respuesta OK (200)
{
"ok": true,
"url": "https://authorize.roblox.com/?...",
"session_token": "abc123..."
}
Inicia el flujo OAuth de Discord. Requiere apikey. Scope: identify guilds.
Parametros
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
apikey | string | Si | API key del usuario |
loopback_port | int | Si | Puerto de 127.0.0.1 donde la app espera la vuelta del navegador (RFC 8252). Sin el: 426 update_required |
Respuesta OK (200)
{
"ok": true,
"url": "https://discord.com/oauth2/authorize?...",
"session_token": "abc123..."
}
Remata el flujo OAuth. Sin finish devuelve siempre pending: la cuenta solo se entrega (y Discord solo se vincula) con el codigo que llego a la app por 127.0.0.1.
Parametros
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
session_token | string | Si | Token del *_oauth_start |
finish | string | Si | El code que recibio la app en su puerto de 127.0.0.1 |
Respuesta pendiente
{ "ok": true, "status": "pending" }
Respuesta completa (Roblox)
{
"ok": true,
"status": "complete",
"roblox_id": "727083479",
"roblox_username": "bielarano",
"apikey": "sk_...",
"user_id": 1
}
Respuesta completa (Discord)
{
"ok": true,
"status": "complete",
"result": "success|already_linked|limit_reached",
"discord_id": "123456789012345678",
"discord_username": "user#1234",
"admin_guilds": [
{ "id": "999...", "name": "Mi Server", "icon": "hash..." }
]
}
Callback de Roblox (automatico). Devuelve HTML. No llamar manualmente.
Callback de Discord (automatico). Devuelve HTML. No llamar manualmente.
Users — Perfil
Obtiene perfil completo del usuario: Roblox, Discord accounts, servidores.
Parametros
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
apikey | string | Si | API key del usuario |
Respuesta OK (200)
{
"ok": true,
"user_id": 1,
"roblox_id": "727083479",
"roblox_username": "bielarano",
"discord_accounts": [
{ "discord_id": "123...", "discord_username": "user#1234" }
],
"servers": [
{
"server_id": 8,
"server_name": "Mi Server",
"server_type": "voice",
"logo_url": null,
"role": "owner"
}
]
}
Devuelve solo las cuentas de Discord vinculadas.
Parametros
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
apikey | string | Si | API key del usuario |
Respuesta OK (200)
{
"ok": true,
"user_id": 1,
"discord_accounts": [
{ "discord_id": "123...", "discord_username": "user#1234" }
]
}
Devuelve texto plano "si" o "no".
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
roblox_id | string | Si | ID numerico de Roblox |
Users — Terminos y privacidad
Que version de los Terminos del servicio (terms) y de la Politica de privacidad (privacy) rige y cual ha aceptado la cuenta. Las versiones en vigor salen de config/blixye.php (legal_versions); cada aceptacion queda en legal_acceptances (cuenta, documento, version, hora, IP y dispositivo), y se guardan todas, no solo la ultima. El backend no bloquea nada: pedirlas y no dejar seguir es cosa del cliente. Solo sesiones de la app: una sesion de juego (gs_) da 401.
Las versiones en vigor, las que ha aceptado la cuenta y si le falta alguna. accepted es, por documento, la version en vigor si la ha aceptado y si no la ultima que acepto (null si ninguna). pending es true si le falta aceptar la version en vigor de cualquiera de los dos.
Parametros
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
apikey | string | Si | API key del usuario (o cabecera X-Api-Key) |
Respuesta OK (200)
{
"ok": true,
"current": { "terms": "2026-09-26", "privacy": "2026-09-26" },
"accepted": { "terms": null, "privacy": "2026-09-04" },
"pending": true
}
Errores
400 sin apikey o con formato invalido · 401 apikey que no existe o ha caducado.
Acepta las versiones LEIDAS de los dos documentos. Tienen que ser las dos en vigor: si alguna no lo es (cambio mientras se leia) o falta, 409 con las de ahora y no se apunta nada. Idempotente: aceptar otra vez lo mismo no escribe nada ni mueve la hora de la primera vez. Guarda la IP y el dispositivo (device si viene; si no, el de la sesion). Devuelve lo mismo que legal_status.
Parametros
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
apikey | string | Si | API key del usuario (o cabecera X-Api-Key) |
terms_version | string | Si | La version de los Terminos que se ha ensenado (current.terms) |
privacy_version | string | Si | La version de la Politica de privacidad que se ha ensenado (current.privacy) |
device | string | No | Nombre del dispositivo, como al entrar (se recorta a 80). Sin el se guarda el de la sesion |
Respuesta OK (200)
{
"ok": true,
"current": { "terms": "2026-09-26", "privacy": "2026-09-26" },
"accepted": { "terms": "2026-09-26", "privacy": "2026-09-26" },
"pending": false
}
Error 409 (version que ya no rige)
{
"ok": false,
"error_code": "stale_legal_version",
"error": "The Terms of Service or the Privacy Policy changed while you were reading them. Read them again.",
"current": { "terms": "2026-09-26", "privacy": "2026-09-26" },
"accepted": { "terms": null, "privacy": "2026-09-04" },
"pending": true
}
Otros errores
400 / 401 como en legal_status · 503 si falta la migracion de legal_acceptances (mientras tanto legal_status contesta pending: false, para no pedir lo que no se puede apuntar).
El texto de los documentos legales de un idioma, TAL CUAL lo publica la web (https://blixye.com/assets/blixye/legal.json, blixye.legal_source_url), con diez minutos de cache y la ultima copia buena de respaldo. Sin llave: se lee antes de entrar. De ahi salen tambien las versiones que piden legal_status y accept_legal (la configuracion solo es el respaldo).
Parametros
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
idioma | string | No | es o en (por defecto en) |
Respuesta OK (200)
{
"ok": true,
"idioma": "es",
"versiones": { "terms": "2026-09-26", "privacy": "2026-09-26", "cookies": "2026-09-05", "...": "..." },
"documentos": [ { "id": "terms", "titulo": "Términos del Servicio", "version": "2026-09-26", "secciones": [ "..." ] } ]
}
Errores
503 si la web no contesta y no hay copia guardada: el cliente enseña entonces la que lleva dentro.
Servers — CRUD
Ruta: POST /servers. Parametro de accion: action.
Crea un servidor nuevo. El creador se convierte en owner.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
apikey | string | Si | API key |
server_name | string | Si | 1-100 caracteres |
description | string | No | Max 500 caracteres |
server_type | string | No | voice o text (default: text) |
language_tag | string | No | Max 8 chars (default: es) |
discord_url | string | No | URL valida |
discord_guild_id | string | No | Snowflake 17-20 digitos |
logo_base64 | string | No | Imagen en Base64 |
banner_base64 | string | No | Imagen en Base64 |
Respuesta OK (201)
{
"ok": true,
"server": {
"id": 8,
"server_name": "Mi Server",
"join_code": "ABCD1234",
"is_public": true,
"max_members": 50,
"owner_user_id": 1,
...
}
}
Obtiene informacion de un servidor (incluye config, roles, economy).
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
apikey | string | Si | API key |
server_id | int | Si | ID del servidor |
Lista todos los servidores del usuario autenticado.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
apikey | string | Si | API key |
Busca servidores publicos. Paginado.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
page | int | No | Default: 1 |
per_page | int | No | 1-50, default: 20 |
server_type | string | No | Filtro: voice/text |
language_tag | string | No | Filtro por idioma |
search | string | No | Busqueda por nombre |
Actualiza datos del servidor. Campos opcionales, solo se actualizan los enviados.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
server_id | int | Si | ID del servidor |
server_name | string | No | 1-100 chars |
description | string | No | Max 500 |
server_type | string | No | voice/text |
is_public | bool | No | Visible en discover |
max_members | int | No | 1-10000 |
Elimina el servidor y todos sus datos.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
server_id | int | Si | ID del servidor |
Unirse a un servidor por codigo.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
join_code | string | Si | 4-12 caracteres alfanumericos |
Respuesta
{ "ok": true, "joined": true, "server_id": 8, "server_name": "Mi Server" }
// ya miembro:
{ "ok": true, "joined": false, "reason": "already_member", "server_id": 8 }
Abandonar servidor. El owner no puede salir.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
server_id | int | Si | ID del servidor |
Regenera o establece un codigo de union personalizado.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
server_id | int | Si | ID del servidor |
join_code | string | No | Codigo personalizado 4-12 chars. Si no se envia, genera aleatorio. |
Servers — Miembros
Lista miembros del servidor, paginado.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
server_id | int | Si | ID del servidor |
role | string | No | Filtro: owner/admin/mod/member |
search | string | No | Buscar por roblox_username |
page | int | No | Default: 1 |
per_page | int | No | 1-50, default: 20 |
Cambia el rol de un miembro. No puedes asignar un rol >= al tuyo.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
server_id | int | Si | |
target_user_id | int | Si | Usuario objetivo |
new_role | string | Si | admin, mod, o member |
Expulsa a un miembro. Opcional: elimina sus personajes.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
server_id | int | Si | |
target_user_id | int | Si | Usuario a expulsar |
delete_characters | bool | No | Eliminar personajes del expulsado |
Nota: /server_members tambien ofrece list, kick, set_role con la misma logica.
Servers — Discord Guild
Vincula un servidor Blixye a un guild de Discord.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
server_id | int | Si | |
discord_guild_id | string | Si | Snowflake 17-20 digitos |
Error 409 si el guild ya esta vinculado a otro servidor.
Desvincula el guild de Discord del servidor.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
server_id | int | Si |
Server Config
Ruta: POST /server_config. Parametro: action.
Obtiene configuracion del servidor (moneda, items cash, app_names, etc).
Actualiza config del servidor. Todos opcionales.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
server_id | int | Si | |
currency_symbol | string | No | 1-8 chars (ej: "$") |
currency_name | string | No | 1-32 chars |
bill_types | JSON | No | Array de denominaciones |
app_names | JSON | No | Nombres personalizados de apps |
role_limits | JSON | No | Limites por rol |
extra_config | JSON | No | Configuracion extra libre |
Limites de personajes por rol Discord
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
discord_role_id | string | Si | Snowflake 17-20 digitos |
max_characters | int | Si | 1-100 |
Calcula max personajes para un usuario segun sus roles de Discord.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
discord_role_ids | array/string | Si | JSON array o comma-separated |
DNI / Personajes
Ruta: POST /server_dni. Parametro: action.
Configuracion del DNI: nombre documento, edad min/max, formato numero, campos, nacionalidades.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
document_name | string | No | Max 32 chars |
min_age | int | No | 1-255 |
max_age | int | No | 1-255 |
dni_number_format | string | No | Max 64 chars |
name_fields | int | No | 1-5 |
surname_fields | int | No | 0-5 |
nationalities | JSON | No | [{name, enabled}] |
custom_fields | JSON | No | Campos extra |
Crea un personaje con DNI. Valida limites de personajes, edad, nacionalidad, etc.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
server_id | int | Si | |
name | string | Si | 1-64 chars |
surname | string | * | Requerido si surname_fields > 0 |
nationality | string | No | De la lista allowed |
gender | string | No | Max 16 chars |
birthdate | string | No | Y-m-d o timestamp |
birth_time | string | No | HH:MM |
image_url | string | No | Max 512 |
discord_id | string | No | Debe pertenecer al usuario |
discord_role_ids | array | No | Para calcular limite de personajes |
custom_data | JSON | No | Datos extra |
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
server_character_id | int | Si |
Campos actualizables: name, surname, nationality, gender, birthdate, birth_time, image_url, custom_data.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
server_character_id | int | Si |
Busca personajes por nombre, apellido o DNI number. Max 50 resultados.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
search | string | No | Busqueda LIKE |
Items
Ruta: POST /server_items. Parametro: action.
Lista items. Filtrable por category_id y search.
Items visibles en la tienda (shop_visible=true, con precio).
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
name | string | Si | 1-64 chars, unico por server |
name_label | string | No | Max 64 |
price | int | No | Precio en tienda |
category_id | int | No | Debe existir |
image_url | string | No | Max 512 |
shop_visible | bool | No | Default: true |
can_gift | bool | No | Default: true |
can_delete | bool | No | Default: true |
can_confiscate | bool | No | Default: true |
can_search | bool | No | Default: true (visible en cacheo) |
user_limit | int | No | Max por personaje |
stock_mode | string | No | infinite/limited/renewable |
stock_quantity | int | No | Stock actual |
require_license_id | int | No | Licencia requerida para comprar |
Update parcial. Mismos campos que create + item_id.
Categorias de Items
Acciones: list_categories, create_category, update_category, delete_category
Params de create: name (1-64, unico), label (1-64), sort_order (int, optional).
Inventario
Ruta: POST /server_inventory. Parametro: action.
Inventario de un personaje. Miembros solo ven el propio.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
server_character_id | int | Si |
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
server_character_id | int | Si | |
item_id | int | Si | |
quantity | int | Si | > 0 |
Mismos params que give.
Transferir item entre personajes. Item debe tener can_gift=true.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
from_character_id | int | Si | Tu personaje |
to_character_id | int | Si | Personaje destino |
item_id | int | Si | |
quantity | int | Si | > 0 |
Eliminar item propio. Item debe tener can_delete=true.
Licencias
Ruta: POST /server_licenses. Parametro: action.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
name | string | Si | 1-64, unico por server |
type | string | No | driving/weapon/custom (default: custom) |
name_label | string | No | Max 64 |
price | int | No | Para tienda |
image_url | string | No | Max 512 |
shop_visible | bool | No | Default: true |
max_points | int | No | Sistema de puntos (null = sin puntos) |
parent_license_id | int | No | Licencia padre |
Otorga licencia a un personaje. Si estaba revocada, la reactiva con max_points.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
server_character_id | int | Si | |
license_id | int | Si |
Revoca licencia. Guarda revoked_by="user#{user_id}".
Resta puntos. Si llega a 0, auto-revoca con revoked_by='auto:points_depleted'.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
points | int | Si | > 0 |
Respuesta
{ "ok": true, "points_remaining": 3, "is_revoked": false }
Lista licencias de un personaje (con estado de revocacion y puntos).
Tienda
Ruta: POST /server_shop. Parametro: action.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
server_character_id | int | Si | Tu personaje |
items | JSON | Si | [{"item_id": 1, "quantity": 2}] |
payment_method | string | No | wallet/bank/auto (default: auto) |
Respuesta
{ "ok": true, "total_cost": 500, "payment_method": "wallet" }
Metodos de pago:
wallet: paga con billetes del wallet (algoritmo greedy, denominacion alta primero)bank: debita de cuenta bancaria (v2 primero, fallback legacy)auto: intenta wallet, si no alcanza, intenta bank
Compra una licencia de la tienda. Misma logica de pago.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
license_id | int | Si | |
payment_method | string | No | wallet/bank/auto |
Economia Legacy
Ruta: POST /server_economy. Parametro: action.
Estos endpoints funcionan con el sistema legacy de bank + wallet con billetes fisicos.
Crea cuenta bancaria legacy + tarjeta para un personaje.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
server_character_id | int | Si | Tu personaje |
pin | string | No | PIN (longitud segun config) |
Respuesta
{ "ok": true, "account_id": 1, "card_number": "1234567890123456", "cvv": "123", "balance": 0 }
Info bancaria de un personaje (card_number, balance, has_pin, cvv si es propio).
Billetes en el wallet con total_cash calculado.
Balance total: bank + wallet.
{ "ok": true, "bank_balance": 1000, "wallet_total": 250, "total": 1250, "has_bank": true }
Transferencia entre cuentas (por card_number+cvv o character_id).
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
amount | int | Si | > 0 |
from_card_number + from_cvv | string | * | O usar from_character_id |
to_card_number | string | * | O usar to_character_id |
pin | string | No | Si la cuenta tiene PIN |
Retira dinero del banco al wallet (billetes).
Deposita billetes del wallet al banco.
Historial de transacciones. Paginado.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
page | int | No | Default: 1 |
per_page | int | No | 1-100, default: 50 |
type | string | No | Filtro por tipo |
Bill types: list_bill_types, create_bill_type, update_bill_type, delete_bill_type (owner/admin).
Bank v2 — Cuentas
Todas las acciones bank v2/v3 van por POST /server_economy.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
server_character_id | int | Si | |
account_type | string | Si | personal/shared/business/custom/savings/vault |
account_name | string | No | Max 64 (no para personal) |
pin | string | No | Segun config |
Lista cuentas donde el personaje es miembro.
Dashboard completo: cuentas, total_balance, tarjetas activas, deudas, prestamos, credit score.
Solo el dueno. Balance debe ser 0. No puedes cerrar la cuenta personal ni la principal.
Transferencia entre tus propias cuentas.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
from_account_id | int | Si | |
to_account_id | int | Si | |
amount | int | Si | > 0 |
Bank v2 — Miembros de cuenta
Acciones: list_account_members, remove_account_member, update_member_perms
Permisos de cuenta: view_balance, view_movements, pay, approve_payments, transfer, create_cards, manage_cards, sign_debts, edit_settings, manage_members
Bank v2 — Tarjetas
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
account_id | int | Si | |
server_character_id | int | Si | |
card_type | string | Si | permanent/temporary_time/temporary_uses/temporary_both |
expires_at | string | * | ISO8601, requerido para temporary_time/both |
max_uses | int | * | Requerido para temporary_uses/both |
discord_role_ids | array | No | Para limites por rol |
Respuesta incluye cvv (solo se muestra en creacion).
Crea tarjeta compartida con otro personaje. Auto-agrega como miembro de cuenta.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
holder_character_id | int | Si | Debe ser diferente al tuyo |
permissions | array/JSON | Si | Permisos del titular |
Otras acciones: list_cards, get_card, disable_card, enable_card, link_card, delete_card, rename_card (nickname max 50), update_card_limits (daily_limit, monthly_limit, per_transaction_limit), get_card_history.
Bank v2 — PIN
Establece o cambia PIN. Si ya tiene PIN, old_pin es requerido.
Reset forzado del PIN (admin).
Verifica PIN. Se bloquea tras N intentos fallidos.
Respuesta OK
{ "ok": true, "has_pin": true, "verified": true }
Error 401 (incorrecto)
{ "ok": false, "error": "PIN incorrecto", "attempts_remaining": 2 }
Error 423 (bloqueado)
{ "ok": false, "error": "PIN bloqueado", "remaining_minutes": 15 }
Bank v2 — Configuracion bancaria
Acciones: get_bank_config, update_bank_config (owner/admin), get_card_role_limits, set_card_role_limits.
Config sections: cards_config, pin_config, payment_config, fines_config, transfers_config, subscriptions_config, debts_config, limits_config, rewards_config, modules, accounts_config, credit_config, inheritance_config, tax_config, loans_config, notifications_config.
Bank v2 — Transferencias
Ver transfer y internal_transfer arriba. Las transferencias usan DB::transaction + lockForUpdate para atomicidad.
Bank v2 — Payment Requests
Acciones: create_payment_request, list_payment_requests (filtro: direction=sent/received/all, status), approve_payment_request (requiere PIN si tiene), reject_payment_request, cancel_payment_request.
Bank v2 — Recompensas
Acciones: configure_reward (owner/admin), list_rewards, delete_reward, get_claimable, claim_rewards.
Las recompensas se depositan en la cuenta principal (is_main). Requiere modulo rewards habilitado.
Bank v2 — Deudas
Acciones: create_debt, get_debt, list_debts, sign_debt, pay_debt, cancel_debt.
Bank v2 — Transferencias programadas
Acciones: create_scheduled_transfer, list_scheduled_transfers, get_scheduled_transfer, cancel_scheduled_transfer, pause_scheduled_transfer, resume_scheduled_transfer.
Bank v2 — Suscripciones
Acciones: create_subscription, list_subscriptions, get_subscription, cancel_subscription, pause_subscription, resume_subscription.
Bank v2 — Analytics / Limites
Acciones: get_analytics, get_limits (owner/admin).
Bank v3 — Notificaciones
Acciones: list_notifications (filter: all/read/unread, paginado), mark_notification_read, mark_all_notifications_read, get_unread_count.
Bank v3 — Contactos
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
server_character_id | int | Si | |
alias | string | Si | 1-50 chars |
contact_card_number | string | * | O usar contact_character_id |
contact_character_id | int | * | O usar contact_card_number |
Otras: list_contacts, remove_contact.
Bank v3 — Boveda
Acciones: deposit_vault_item (item_name requerido, 1-100 chars), withdraw_vault_item, list_vault_items, get_vault_info.
La boveda es una cuenta tipo vault. Puede tener max_items, access_fee y cooldown_hours.
Bank v3 — Credit Score
Respuesta
{
"ok": true,
"credit": {
"score": 750,
"tier": "excellent",
"factors": {...},
"min_score": 0,
"max_score": 1000,
"tiers": { "excellent": 800, "good": 650, "fair": 500, "poor": 0 }
}
}
Bank v3 — Herencia
Acciones: set_beneficiary (percentage 1-100, total max 100%), list_beneficiaries, remove_beneficiary, execute_inheritance (owner/admin, aplica impuesto, cierra cuenta origen).
Bank v3 — Impuestos
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
name | string | Si | 1-100 chars |
tax_type | string | Si | income/transfer/property/interest/inheritance/custom |
rate | float | Si | 0-100 |
Otras: list_taxes, delete_tax, get_tax_history (paginado).
Bank v3 — Prestamos
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
account_id | int | Si | |
amount | int | Si | > 0, <= max_loan_amount |
installments | int | Si | 1-max |
frequency | string | No | 1d/1w/2w/1mo (default: 1mo) |
Puede auto-aprobarse segun config. Interes basado en credit score.
Otras: approve_loan (admin), reject_loan (admin), list_loans, get_loan, pay_loan, cancel_loan (admin).
Bank v3 — Ahorros
Accion: get_interest_history (paginado). Historial de intereses generados en cuentas de ahorro.
Vehiculos — Modelos
Ruta: POST /server_cars. Parametro: action.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
active_only | bool | No | Default: true |
page | int | No | |
per_page | int | No | 1-100 |
Requiere permiso manage_vehicle_models.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
brand | string | Si | 1-64 chars |
model | string | Si | 1-64 chars |
price | int | No | Default: 0 |
doors | int | No | |
photo_url | string | No |
Otras: update_vehicle_model, delete_vehicle_model (falla 409 si hay vehiculos usandolo).
Vehiculos — Configuracion
Requiere permiso manage_vehicle_config.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
plate_mode | string | No | random/custom/sequential |
plate_format | string | No | |
plate_regex | string | No | |
plate_prefix | string | No | |
max_vehicles_per_char | int | No | 1-255 |
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
discord_role_id | string | Si | |
max_vehicles | int | Si | 1-255 |
Vehiculos — Admin
Requiere permiso manage_vehicles.
Acciones: admin_update_vehicle (plate, color), admin_remove_vehicle, search_vehicles (filtros: plate, character_id, model_id, paginado), get_vehicle_logs.
Vehiculos — Jugador
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
server_character_id | int | Si | |
vehicle_model_id | int | Si | |
plate | string | * | Custom plate (si plate_mode=custom) |
color | string | No | Default: #FFFFFF |
payment_method | string | No | auto/bank/wallet |
Otras: get_my_vehicles, get_vehicle, remove_vehicle (solo tu vehiculo).
Roles Custom
Ruta: POST /server_roles. Parametro: action.
Sistema de roles personalizados con jerarquia y permisos granulares.
Ordenados por hierarchy DESC.
Requiere permiso manage_roles. Tu hierarchy debe ser > al del nuevo rol.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
name | string | Si | 1-64, unico por server |
color | string | No | #RRGGBB (default: #99AAB5) |
hierarchy | int | No | 1-99 (100 = Owner, reservado) |
permissions | array | No | Lista de permisos |
max_members | int | No |
Requiere manage_roles y/o manage_role_permissions. Roles de sistema: solo se puede cambiar el color.
No se pueden borrar roles de sistema. Miembros se reasignan a "Member".
Transfiere ownership a otro miembro. El owner actual baja a Admin.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
target_discord_id | string | Si | Discord ID del nuevo owner |
Permisos disponibles
| Permiso | Descripcion |
|---|---|
manage_roles | Crear, editar y eliminar roles |
manage_role_permissions | Editar permisos de roles |
assign_roles | Asignar roles a miembros |
manage_members | Gestionar miembros del servidor |
manage_vehicle_models | Gestionar modelos de vehiculos |
manage_vehicle_config | Configurar sistema de vehiculos |
manage_vehicles | Gestionar vehiculos de miembros |
manage_bank_config | Configurar sistema bancario |
approve_loans | Aprobar prestamos bancarios |
view_bank_logs | Ver logs bancarios |
execute_inheritance | Ejecutar herencias |
manage_taxes | Configurar impuestos |
manage_items | Gestionar items del servidor |
manage_licenses | Gestionar licencias |
manage_dni | Gestionar DNIs/personajes |
manage_shop | Gestionar tienda |
view_logs | Ver logs de auditoria |
Bot (server_bot)
Ruta: POST /server_bot. Requiere header X-MDT-Internal-Key, que solo tiene el bot de Discord de Blixye. Rate limit: 180/min.
Solo el vinculo de un servidor de Discord con su comunidad: discord_link_verify, discord_link_info, discord_link_unlink y discord_member_recognized. Resuelven por guild_id/codigo y por lo que el bot saca de Discord (dueno del gremio).
Dinero, objetos, CK y el resto de acciones de bot van por /discord_bot, con un token por servidor (X-Bot-Token) y el permiso del rol de quien actua comprobado en el servidor. Las nueve acciones que habia aqui y /server_bot_permissions se quitaron el 2026-09-23: se fiaban del server_id y de los roles que mandara quien llamase.
Cacheo / Search
Ruta: POST /server_cacheo. Sistema de registro/cacheo de personajes.
Inicia sesion de cacheo. Devuelve items searchable del target.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
searcher_character_id | int | Si | Tu personaje |
target_character_id | int | Si | Personaje a cachear |
Decide item por item: confiscated o left.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
session_id | int | Si | |
result_id | int | Si | |
item_action | string | Si | confiscated o left |
Completa cacheo. Todos los items deben estar confirmados. Los confiscated se eliminan del inventario.
Cancela sin aplicar confiscaciones.
Audit Logs
Ruta: POST /server_logs. Parametro: action.
| Param | Tipo | Req | Descripcion |
|---|---|---|---|
server_id | int | Si | |
domain | string | No | Filtro: bank, inventory, vehicle, license, etc. |
action | string | No | Filtro por tipo de accion |
character_id | int | No | Filtro por personaje |
search | string | No | Busqueda LIKE en note y action |
date_from | string | No | Fecha inicio |
date_to | string | No | Fecha fin |
page | int | No | Default: 1 |
per_page | int | No | 1-100, default: 50 |
Parametro comun en todos los endpoints de server:
server_id (int) + apikey (string)