{
  "openapi": "3.1.0",
  "info": {
    "title": "API de Quick Rent de TronBid",
    "version": "2.0.0",
    "description": "Automatiza el alquiler de energía TRON para transferencias de USDT TRC-20. Crea pedidos idempotentes y paga en la red o con tu saldo de TronBid.",
    "contact": {
      "name": "Soporte de la API de TronBid",
      "url": "https://t.me/tronbid"
    }
  },
  "externalDocs": {
    "description": "Documentación de la API en español",
    "url": "https://tronbid.com/es/rent-tron-energy-api"
  },
  "servers": [
    {
      "url": "https://tronbid.com/api/v2/quick-rent",
      "description": "Producción"
    }
  ],
  "security": [
    {
      "bearerAuth": []
    }
  ],
  "tags": [
    {
      "name": "Quote"
    },
    {
      "name": "Orders"
    },
    {
      "name": "Account"
    }
  ],
  "paths": {
    "/calculator": {
      "post": {
        "tags": [
          "Quote"
        ],
        "summary": "Calcular la energía que necesita una billetera",
        "operationId": "calculateEnergy",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CalculatorRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resultado del cálculo",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Respuesta de error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Respuesta de error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/quote": {
      "post": {
        "tags": [
          "Quote"
        ],
        "summary": "Obtener el precio actual del alquiler de energía TRON",
        "operationId": "createQuote",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/QuoteRequest"
              },
              "examples": {
                "custom1Minutes": {
                  "summary": "Energía: bloqueo de 1 minuto al precio del paquete de 15 minutos",
                  "value": {
                    "energy_amount": 131000,
                    "resource_type": "energy",
                    "duration_minutes": 15,
                    "custom_lock_minutes": 1
                  }
                },
                "custom5Minutes": {
                  "summary": "Energía: bloqueo de 5 minutos al precio del paquete de 15 minutos",
                  "value": {
                    "energy_amount": 131000,
                    "resource_type": "energy",
                    "duration_minutes": 15,
                    "custom_lock_minutes": 5
                  }
                },
                "custom15Minutes": {
                  "summary": "Energía: bloqueo de 15 minutos al precio del paquete de 15 minutos",
                  "value": {
                    "energy_amount": 131000,
                    "resource_type": "energy",
                    "duration_minutes": 15,
                    "custom_lock_minutes": 15
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Cotización actual",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Quote"
                }
              }
            }
          },
          "400": {
            "description": "Respuesta de error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Respuesta de error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Respuesta de error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/orders": {
      "post": {
        "tags": [
          "Orders"
        ],
        "summary": "Crear un pedido idempotente de alquiler de energía",
        "operationId": "createOrder",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateOrderRequest"
              },
              "examples": {
                "custom1Minutes": {
                  "summary": "Energía: bloqueo de 1 minuto al precio del paquete de 15 minutos",
                  "value": {
                    "energy_amount": 131000,
                    "resource_type": "energy",
                    "duration_minutes": 15,
                    "custom_lock_minutes": 1,
                    "idempotency_key": "partner-custom-1min-001",
                    "payment_mode": "balance",
                    "target_address": "TTargetWalletXXXXXXXXXXXXXXXXXXXXX"
                  }
                },
                "custom5Minutes": {
                  "summary": "Energía: bloqueo de 5 minutos al precio del paquete de 15 minutos",
                  "value": {
                    "energy_amount": 131000,
                    "resource_type": "energy",
                    "duration_minutes": 15,
                    "custom_lock_minutes": 5,
                    "idempotency_key": "partner-custom-5min-001",
                    "payment_mode": "balance",
                    "target_address": "TTargetWalletXXXXXXXXXXXXXXXXXXXXX"
                  }
                },
                "custom15Minutes": {
                  "summary": "Energía: bloqueo de 15 minutos al precio del paquete de 15 minutos",
                  "value": {
                    "energy_amount": 131000,
                    "resource_type": "energy",
                    "duration_minutes": 15,
                    "custom_lock_minutes": 15,
                    "idempotency_key": "partner-custom-15min-001",
                    "payment_mode": "balance",
                    "target_address": "TTargetWalletXXXXXXXXXXXXXXXXXXXXX"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Pedido creado o pedido coincidente creado anteriormente",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Order"
                }
              }
            }
          },
          "400": {
            "description": "Respuesta de error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Respuesta de error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Respuesta de error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "Conflicto. Incluye IDEMPOTENCY_CUSTOM_LOCK_MISMATCH si se cambia, añade o elimina el bloqueo opcional de un pedido cuya clave ya existe.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Respuesta de error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "description": "Añade custom_lock_minutes a POST /quote y POST /orders para elegir un bloqueo de energía en minutos enteros: 1, 2, 3, …, 15. Los pedidos personalizados requieren tu clave de API y admiten tanto el pago en la red como el pago con saldo, si está habilitado. Esta opción no está disponible para ancho de banda, las compras en el sitio web ni el bot de Telegram.\n\nMantén duration_minutes en 15: este campo selecciona el paquete que determina el precio. custom_lock_minutes define la duración real del bloqueo. Usa un energy_amount activo del catálogo de 15 minutos. El precio y la bonificación de energía son exactamente los de ese paquete; no hay descuento por minuto. Consulta el precio vigente en /quote: los ejemplos no establecen un precio fijo.\n\nEl campo es opcional. Omítelo para conservar el funcionamiento de 15 o 60 minutos, los precios y el formato de respuesta actuales. No tiene un valor predeterminado implícito. Envía un entero JSON; las cadenas de texto, las fracciones, null, 0, los números negativos y los valores superiores a 15 se rechazan con HTTP 400. También se rechaza Custom Locked con duration_minutes: 60 o resource_type: bandwidth.\n\nEn los pedidos con pago en la red, envía el amount_trx recibido a pay_address desde payer_address antes de expires_at. Si omites target_address, se usa payer_address. Para pagar con saldo, envía target_address y payment_mode: balance; tu clave de API debe tener habilitado el pago con saldo.\n\nEl bloqueo comienza cuando la delegación se incluye en TRON, no al solicitar una cotización, crear el pedido o pagar. Un minuto equivale a 20 bloques de TRON, aproximadamente 60 segundos. Guardamos el vencimiento real de la delegación en delegation_expires_at. El campo expires_at de la respuesta de pago indica un plazo distinto: la fecha límite para pagar.\n\nConsulta GET /orders/:id periódicamente, por ejemplo, cada 3 segundos. Las respuestas de pedidos personalizados incluyen custom_lock_minutes y lock_period_blocks. El endpoint de estado también devuelve delegation_expires_at, reclaim_status, txid_delegate, txid_reclaim y reclaimed_at. Las fechas y los identificadores de transacción que aún no están disponibles tienen el valor null.\n\nCiclo del pedido: pending_payment (solo para pagos en la red) → delegating → delegated → undelegating → completed. delegated significa que la energía se ha entregado. undelegating indica que el bloqueo ha terminado y se está retirando la delegación; reclaim_status es pending. completed junto con reclaim_status: confirmed significa que la transacción de retirada tiene confirmación sólida en la red. No hace falta solicitar la retirada por separado.\n\nLos pedidos personalizados tienen una comprobación de recuperación cada 3 segundos. La retirada se intenta en cuanto TRON indica que la delegación está desbloqueada, con independencia de la revisión de los pools cada cinco minutos. La producción de bloques, la carga de la cola y la disponibilidad de los proveedores RPC pueden retrasar el envío; la confirmación de la red requiere tiempo adicional. Nunca se retira una delegación antes de que venza el bloqueo en la red.\n\nLos pedidos, las transacciones firmadas y los intentos de retirada se guardan de forma persistente. Tras un reinicio o una espera agotada del proveedor RPC, se retoma la misma transacción, sin crear otro alquiler. Los fallos del proveedor se reintentan automáticamente. El par de direcciones de origen y destino queda reservado hasta que se confirma la retirada; otro pool libre puede atender un nuevo pedido.\n\nReutiliza la misma idempotency_key al reintentar. Cambiar, añadir o eliminar custom_lock_minutes con una clave existente devuelve 409 IDEMPOTENCY_CUSTOM_LOCK_MISMATCH. Usa una clave nueva para un bloqueo diferente. Siguen vigentes las reglas de incompatibilidad del modo de pago.\n\nLos webhooks configurados conservan su firma y mecanismo de entrega. Los eventos personalizados incluyen los campos opcionales del bloqueo: quick_buy.delegated cuando se entrega la energía; quick_buy.expired con status: completed y txid_reclaim tras confirmar la retirada; o quick_buy.failed si se verifica que la delegación falló. Deduplica los eventos por event_id. Si el proveedor no permite confirmar el resultado, consulta el pedido existente en lugar de crear otro."
      }
    },
    "/orders/{id}": {
      "get": {
        "tags": [
          "Orders"
        ],
        "summary": "Consultar el estado de un pedido",
        "operationId": "getOrder",
        "parameters": [
          {
            "$ref": "#/components/parameters/OrderId"
          }
        ],
        "responses": {
          "200": {
            "description": "Estado del pedido",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrderStatus"
                }
              }
            }
          },
          "401": {
            "description": "Respuesta de error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Respuesta de error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/orders/{id}/cancel": {
      "post": {
        "tags": [
          "Orders"
        ],
        "summary": "Cancelar un pedido pendiente de pago",
        "operationId": "cancelOrder",
        "parameters": [
          {
            "$ref": "#/components/parameters/OrderId"
          }
        ],
        "responses": {
          "200": {
            "description": "Pedido cancelado",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Order"
                }
              }
            }
          },
          "401": {
            "description": "Respuesta de error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Respuesta de error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "Respuesta de error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/orders/{id}/set-payer": {
      "post": {
        "tags": [
          "Orders"
        ],
        "summary": "Indicar la dirección de pago de un pedido pendiente",
        "operationId": "setOrderPayer",
        "parameters": [
          {
            "$ref": "#/components/parameters/OrderId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "payer_address"
                ],
                "properties": {
                  "payer_address": {
                    "type": "string",
                    "pattern": "^T[1-9A-HJ-NP-Za-km-z]{33}$",
                    "example": "TXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Pedido actualizado",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Order"
                }
              }
            }
          },
          "400": {
            "description": "Respuesta de error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Respuesta de error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Respuesta de error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "Respuesta de error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/balance": {
      "get": {
        "tags": [
          "Account"
        ],
        "summary": "Consultar el saldo en TRX de TronBid vinculado a la clave de API",
        "operationId": "getBalance",
        "responses": {
          "200": {
            "description": "Saldo de la cuenta",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "balance_trx"
                  ],
                  "properties": {
                    "balance_trx": {
                      "type": "string",
                      "example": "150.500000"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Respuesta de error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v2/quick-rent/availability": {
      "post": {
        "operationId": "checkQuickRentAvailability",
        "summary": "Comprobar si hay un pool de energía disponible para un destinatario",
        "description": "Consulta de solo lectura para comprobar si los pools de energía de Quick Rent están ocupados para un destinatario. Se aplican los límites vigentes por clave de API e IP. Incluye los pedidos pendientes y las reservas de Custom Locked. No reserva ningún pool ni valida el volumen, el precio, el saldo, la activación o las restricciones del mercado. Sigue gestionando los errores habituales al crear pedidos: la disponibilidad puede cambiar entre la consulta y la creación. Un código 503 indica que no se pudo determinar la disponibilidad; no equivale a disponible ni a ocupado.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "target_address"
                ],
                "properties": {
                  "target_address": {
                    "type": "string",
                    "maxLength": 64,
                    "description": "Dirección TRON del destinatario en Base58, con suma de comprobación válida.",
                    "example": "TWLaGaf3k6dbiEWvif1tNLeKuTErk2Tron"
                  },
                  "resource_type": {
                    "type": "string",
                    "enum": [
                      "energy"
                    ],
                    "default": "energy"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Comprobación realizada. Que los pools estén ocupados es un resultado normal. checked_at indica cuándo terminó la comprobación, en UTC; no garantiza la hora de desbloqueo.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuickRentAddressAvailability"
                },
                "examples": {
                  "AVAILABLE": {
                    "value": {
                      "resource_type": "energy",
                      "target_address": "TWLaGaf3k6dbiEWvif1tNLeKuTErk2Tron",
                      "available": true,
                      "reason": "AVAILABLE",
                      "checked_at": "2026-09-30T12:00:00.000Z"
                    }
                  },
                  "ALL_POOLS_BUSY": {
                    "value": {
                      "resource_type": "energy",
                      "target_address": "TWLaGaf3k6dbiEWvif1tNLeKuTErk2Tron",
                      "available": false,
                      "reason": "ALL_POOLS_BUSY",
                      "checked_at": "2026-09-30T12:00:00.000Z"
                    }
                  },
                  "NO_ELIGIBLE_POOLS": {
                    "value": {
                      "resource_type": "energy",
                      "target_address": "TWLaGaf3k6dbiEWvif1tNLeKuTErk2Tron",
                      "available": false,
                      "reason": "NO_ELIGIBLE_POOLS",
                      "checked_at": "2026-09-30T12:00:00.000Z"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "JSON o campos incorrectos, recurso no admitido o suma de comprobación de la dirección no válida.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "INVALID_REQUEST",
                        "INVALID_TARGET_ADDRESS"
                      ]
                    },
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Clave de API ausente, desactivada o no válida.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "Unauthorized"
                      ]
                    },
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Se ha superado el límite de solicitudes vigente para la clave de API o la IP.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "Too Many Requests"
                      ]
                    },
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Servicio desactivado o disponibilidad desconocida. Reintenta aumentando la espera entre intentos.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "QUICK_RENT_DISABLED",
                        "AVAILABILITY_CHECK_UNAVAILABLE"
                      ]
                    },
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "API key",
        "description": "Authorization: Bearer <API_KEY>"
      }
    },
    "parameters": {
      "OrderId": {
        "name": "id",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string",
          "format": "uuid"
        }
      }
    },
    "schemas": {
      "CalculatorRequest": {
        "type": "object",
        "required": [
          "wallet_address"
        ],
        "properties": {
          "wallet_address": {
            "type": "string",
            "pattern": "^T[1-9A-HJ-NP-Za-km-z]{33}$",
            "example": "TXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
          },
          "has_usdt": {
            "type": [
              "boolean",
              "null"
            ],
            "default": null
          }
        }
      },
      "QuoteRequest": {
        "type": "object",
        "required": [
          "energy_amount",
          "duration_minutes"
        ],
        "properties": {
          "energy_amount": {
            "type": "integer",
            "minimum": 1,
            "example": 131000
          },
          "duration_minutes": {
            "type": "integer",
            "minimum": 1,
            "example": 15,
            "enum": [
              15,
              60
            ],
            "description": "Duración del paquete que determina el precio. Debe ser 15 si se usa custom_lock_minutes."
          },
          "resource_type": {
            "type": "string",
            "enum": [
              "energy",
              "bandwidth"
            ],
            "default": "energy"
          },
          "custom_lock_minutes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 15,
            "description": "Entero opcional entre 1 y 15, ambos incluidos. Solo está disponible para energía mediante la API y requiere duration_minutes: 15. Omítelo para mantener el funcionamiento habitual."
          }
        },
        "allOf": [
          {
            "if": {
              "required": [
                "custom_lock_minutes"
              ]
            },
            "then": {
              "properties": {
                "duration_minutes": {
                  "const": 15
                },
                "resource_type": {
                  "const": "energy"
                }
              }
            }
          }
        ]
      },
      "Quote": {
        "type": "object",
        "required": [
          "price_trx",
          "available",
          "expires_in_sec"
        ],
        "properties": {
          "price_trx": {
            "type": "string",
            "example": "3.200000"
          },
          "available": {
            "type": "boolean",
            "example": true
          },
          "save_percent": {
            "type": "number",
            "example": 62
          },
          "expires_in_sec": {
            "type": "integer",
            "example": 30
          },
          "custom_lock_minutes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 15,
            "description": "Entero opcional entre 1 y 15, ambos incluidos. Solo está disponible para energía mediante la API y requiere duration_minutes: 15. Omítelo para mantener el funcionamiento habitual."
          },
          "lock_period_blocks": {
            "type": "integer",
            "minimum": 20,
            "maximum": 300,
            "multipleOf": 20,
            "description": "Duración del bloqueo personalizado en bloques de TRON: custom_lock_minutes × 20. Solo aparece en solicitudes con bloqueo personalizado."
          }
        }
      },
      "CreateOrderRequest": {
        "allOf": [
          {
            "$ref": "#/components/schemas/QuoteRequest"
          },
          {
            "type": "object",
            "required": [
              "idempotency_key"
            ],
            "properties": {
              "idempotency_key": {
                "type": "string",
                "minLength": 8,
                "maxLength": 128,
                "example": "partner-onchain-001"
              },
              "payment_mode": {
                "type": "string",
                "enum": [
                  "onchain",
                  "balance"
                ],
                "default": "onchain"
              },
              "payer_address": {
                "type": "string",
                "pattern": "^T[1-9A-HJ-NP-Za-km-z]{33}$",
                "example": "TXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
              },
              "target_address": {
                "type": "string",
                "pattern": "^T[1-9A-HJ-NP-Za-km-z]{33}$",
                "example": "TXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
              }
            }
          },
          {
            "if": {
              "required": [
                "payment_mode"
              ],
              "properties": {
                "payment_mode": {
                  "const": "balance"
                }
              }
            },
            "then": {
              "required": [
                "target_address"
              ]
            },
            "else": {
              "required": [
                "payer_address"
              ]
            }
          }
        ],
        "description": "Custom Locked requiere un cliente autenticado de la API de Quick Rent. Omite custom_lock_minutes para mantener el funcionamiento habitual."
      },
      "Order": {
        "type": "object",
        "required": [
          "id",
          "status",
          "payment_mode",
          "amount_trx",
          "energy_amount",
          "duration_minutes",
          "target_address"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "status": {
            "type": "string",
            "enum": [
              "pending_payment",
              "paid",
              "delegating",
              "delegated",
              "failed",
              "expired",
              "cancelled",
              "undelegating",
              "completed"
            ]
          },
          "payment_mode": {
            "type": "string",
            "enum": [
              "onchain",
              "balance"
            ]
          },
          "amount_trx": {
            "type": "string",
            "example": "3.200000"
          },
          "energy_amount": {
            "type": "integer",
            "example": 131000
          },
          "effective_energy_amount": {
            "type": [
              "integer",
              "null"
            ],
            "example": 131000
          },
          "duration_minutes": {
            "type": "integer",
            "example": 15
          },
          "pay_address": {
            "type": [
              "string",
              "null"
            ]
          },
          "payer_address": {
            "type": [
              "string",
              "null"
            ]
          },
          "target_address": {
            "type": "string"
          },
          "expires_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "qr_payload": {
            "type": [
              "string",
              "null"
            ]
          },
          "duplicate": {
            "type": "boolean",
            "default": false
          },
          "error_code": {
            "type": [
              "string",
              "null"
            ]
          },
          "error_message": {
            "type": [
              "string",
              "null"
            ]
          },
          "custom_lock_minutes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 15,
            "description": "Entero opcional entre 1 y 15, ambos incluidos. Solo está disponible para energía mediante la API y requiere duration_minutes: 15. Omítelo para mantener el funcionamiento habitual."
          },
          "lock_period_blocks": {
            "type": "integer",
            "minimum": 20,
            "maximum": 300,
            "multipleOf": 20,
            "description": "Duración del bloqueo personalizado en bloques de TRON: custom_lock_minutes × 20. Solo aparece en solicitudes con bloqueo personalizado."
          }
        }
      },
      "Error": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "string"
          },
          "message": {
            "type": "string"
          }
        },
        "additionalProperties": true
      },
      "OrderStatus": {
        "type": "object",
        "required": [
          "id",
          "status",
          "duration_minutes",
          "resource_type",
          "energy_amount"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "status": {
            "type": "string",
            "enum": [
              "pending_payment",
              "paid",
              "delegating",
              "delegated",
              "failed",
              "expired",
              "cancelled",
              "undelegating",
              "completed"
            ]
          },
          "payment_mode": {
            "type": "string",
            "enum": [
              "onchain",
              "balance"
            ]
          },
          "amount_trx": {
            "type": "string",
            "example": "3.200000"
          },
          "energy_amount": {
            "type": "string",
            "example": 131000
          },
          "effective_energy_amount": {
            "type": [
              "string",
              "null"
            ],
            "example": 131000
          },
          "duration_minutes": {
            "type": "integer",
            "example": 15
          },
          "pay_address": {
            "type": [
              "string",
              "null"
            ]
          },
          "payer_address": {
            "type": [
              "string",
              "null"
            ]
          },
          "target_address": {
            "type": "string"
          },
          "expires_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "qr_payload": {
            "type": [
              "string",
              "null"
            ]
          },
          "duplicate": {
            "type": "boolean",
            "default": false
          },
          "error_code": {
            "type": [
              "string",
              "null"
            ]
          },
          "error_message": {
            "type": [
              "string",
              "null"
            ]
          },
          "custom_lock_minutes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 15,
            "description": "Entero opcional entre 1 y 15, ambos incluidos. Solo está disponible para energía mediante la API y requiere duration_minutes: 15. Omítelo para mantener el funcionamiento habitual."
          },
          "lock_period_blocks": {
            "type": "integer",
            "minimum": 20,
            "maximum": 300,
            "multipleOf": 20,
            "description": "Duración del bloqueo personalizado en bloques de TRON: custom_lock_minutes × 20. Solo aparece en solicitudes con bloqueo personalizado."
          },
          "delegation_expires_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Vencimiento real del bloqueo en la red para pedidos personalizados. Es distinto de expires_at, que marca el plazo de pago."
          },
          "reclaim_status": {
            "type": "string",
            "enum": [
              "not_started",
              "pending",
              "confirmed"
            ],
            "description": "Solo para pedidos personalizados. confirmed indica que la transacción de retirada de la delegación tiene confirmación sólida en la red."
          },
          "txid_delegate": {
            "type": [
              "string",
              "null"
            ]
          },
          "txid_reclaim": {
            "type": [
              "string",
              "null"
            ]
          },
          "reclaimed_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "resource_type": {
            "type": "string",
            "enum": [
              "energy",
              "bandwidth"
            ]
          }
        }
      },
      "QuickRentAddressAvailability": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "resource_type",
          "target_address",
          "available",
          "reason",
          "checked_at"
        ],
        "properties": {
          "resource_type": {
            "type": "string",
            "const": "energy"
          },
          "target_address": {
            "type": "string"
          },
          "available": {
            "type": "boolean"
          },
          "reason": {
            "type": "string",
            "enum": [
              "AVAILABLE",
              "ALL_POOLS_BUSY",
              "NO_ELIGIBLE_POOLS"
            ]
          },
          "checked_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "description": "Consulta de solo lectura para comprobar si los pools de energía de Quick Rent están ocupados para un destinatario. Se aplican los límites vigentes por clave de API e IP. Incluye los pedidos pendientes y las reservas de Custom Locked. No reserva ningún pool ni valida el volumen, el precio, el saldo, la activación o las restricciones del mercado. Sigue gestionando los errores habituales al crear pedidos: la disponibilidad puede cambiar entre la consulta y la creación. Un código 503 indica que no se pudo determinar la disponibilidad; no equivale a disponible ni a ocupado."
      }
    }
  }
}
