Saltar al contenido

API de cuenta y catálogo

Consulte los modelos y el saldo de una clave, y el catálogo público de precios.

EndpointAutenticaciónQué devuelve
GET /v1/modelsClave (cualquiera de los dos encabezados)Los modelos que sirven los grupos de esta clave
GET /v1/usageClave (solo Bearer)Cuánto puede gastar aún esta clave y su cuota
GET /api/v1/models/pricingNingunaEl catálogo público de modelos con precios de lista

Ninguno de estos endpoints se factura y ninguno exige saldo positivo.

Listar modelos

GET /v1/models acepta Authorization: Bearer sk-… o x-api-key: sk-…; GET /v1/usage solo acepta Authorization: Bearer sk-….

curl https://api.hop-base.com/v1/models \
  -H "Authorization: Bearer sk-your-key"

La lista contiene solo los modelos de los grupos que incluye la clave (si tiene varios, la unión de todos) y llega completa en una sola respuesta (sin paginación). Las claves de grupos compatibles con OpenAI reciben una lista con formato OpenAI:

{
  "object": "list",
  "data": [
    {
      "id": "gpt-6-astra",
      "object": "model",
      "created": 1790222400,
      "owned_by": "hopbase",
      "capabilities": ["chat", "reasoning"],
      "context_window": 1050000,
      "context_length": 1050000,
      "max_input_tokens": 1050000,
      "max_output_tokens": 128000
    }
  ]
}

Las claves de grupos Claude reciben el formato de Anthropic:

{
  "object": "list",
  "data": [
    {
      "id": "claude-sonnet-5-5",
      "object": "model",
      "type": "model",
      "display_name": "Claude Sonnet 5.5",
      "created_at": "2026-09-28T00:00:00Z"
    }
  ],
  "has_more": false,
  "first_id": "claude-sonnet-5-5",
  "last_id": "claude-haiku-4-5-20251001"
}
CampoTipoSignificado
data[].idstringEl ID de modelo que se envía en las solicitudes. Es el único campo en el que conviene confiar
data[].capabilitiesstring[]Por ejemplo chat, reasoning, image_generation
data[].image_onlybooleantrue en modelos de imagen; ausente en los demás
data[].context_window, context_length, max_input_tokensinteger, tokensEl mismo valor con tres nombres por compatibilidad con clientes; ausente si no está publicado
data[].max_output_tokensinteger, tokensAusente si no está publicado
data[].createdinteger, segundos UnixHora de esta respuesta, no fecha de lanzamiento
data[].display_name, created_atstringSolo grupos Claude; created_at es la fecha de lanzamiento del modelo (RFC 3339)

has_more, first_id y last_id existen solo por compatibilidad con los SDK: la lista nunca se pagina, así que no pagine con ellos. Algunos modelos pueden no traer campos distintos de id; trate los campos desconocidos como opcionales.

Moneda del saldo: USD

Desde el 2026-10-01, el saldo de la cuenta, las cuotas de las claves, los cargos y los registros de consumo se expresan en dólares estadounidenses (USD): los modelos se cobran al precio oficial en USD multiplicado por la tarifa de su grupo, y tanto la consola como GET /v1/usage muestran importes en USD.

  • Saldo existente: se convirtió a USD con una tasa fija, así que lo que puede gastar no cambió. Los precios de los grupos y las claves tampoco cambiaron.
  • Cargos por solicitud: para que las integraciones existentes sigan funcionando, cost y X-HopBase-Cost en las respuestas siguen siendo el mismo cargo en CNY (con hasta 6 decimales) y currency siempre es CNY. El importe en USD que se descuenta realmente de su saldo está en cost_usd y X-HopBase-Cost-USD, y coincide con Consumo. Vea Cargos.
  • Recargas: la moneda de pago, las comisiones y el importe acreditado son los que muestra la página Recarga antes de pagar; las comisiones se indican por separado y no se acreditan. En las transferencias bancarias de empresa y las recargas fuera de línea en CNY, el importe en USD que se acredita lo confirma el equipo de soporte.

Saldo y cuota

curl https://api.hop-base.com/v1/usage \
  -H "Authorization: Bearer sk-your-key"

Una clave con una cuota de $10, de la que se han usado $2:

{
  "is_active": true,
  "balance": 8,
  "remaining": 8,
  "unit": "USD",
  "ledger_currency": "USD",
  "balance_cny": 54.4,
  "balance_usd": 8,
  "quota": {
    "remaining": 8,
    "api_key_remaining": 8,
    "total": 10,
    "used": 2,
    "unlimited": false,
    "remaining_cny": 54.4,
    "remaining_usd": 8,
    "api_key_remaining_cny": 54.4,
    "api_key_remaining_usd": 8,
    "total_cny": 68,
    "total_usd": 10,
    "used_cny": 13.6,
    "used_usd": 2
  }
}
CampoTipoSignificado
balancenumber, USDLo que esta clave puede gastar ahora; reglas debajo
remainingnumber, USDMismo valor que balance
is_activebooleantrue cuando balance es mayor que 0
unitstringSiempre "USD", igual que ledger_currency
ledger_currencystringMoneda de los importes sin sufijo: "USD" (antes del 2026-10-01 era "CNY")
quota.remainingnumber, USDMismo valor que balance
quota.api_key_remainingnumber, USDCuota que le queda a esta clave; igual al saldo de la cuenta si la clave no tiene cuota
quota.totalnumber, USDCuota de la clave; 0 significa sin cuota de clave
quota.usednumber, USDTotal cobrado a esta clave hasta ahora
quota.unlimitedbooleantrue cuando la clave no tiene cuota propia

Cómo se calcula balance:

  • Clave sin cuota propia: el saldo de la cuenta.
  • Clave con cuota: la cuota que le queda.
  • Las claves de miembros de equipo y departamentos se limitan además a la cuota restante del periodo del miembro y del departamento.

Los importes sin sufijo son balance, remaining, quota.remaining, quota.api_key_remaining, quota.total y quota.used.

Cada importe tiene además un campo en CNY y otro en USD con sufijo:

CampoTipoSignificado
balance_cny, balance_usdnumberbalance en CNY y en USD
quota.remaining_cny, quota.remaining_usdnumberquota.remaining en CNY y en USD
quota.api_key_remaining_cny, quota.api_key_remaining_usdnumber o nullquota.api_key_remaining en CNY y en USD; null si la clave no tiene cuota
quota.total_cny, quota.total_usdnumber o nullquota.total en CNY y en USD; null si la clave no tiene cuota
quota.used_cny, quota.used_usdnumberquota.used en CNY y en USD
Los importes están en USD.

balance, remaining y los importes quota.* sin sufijo son valores en USD, los mismos números que muestra la consola en su saldo y en Consumo. Para obtener CNY, lea los campos _cny: los mismos importes en CNY (conversión fija, no un tipo de cambio en tiempo real). Los importes llevan hasta 8 decimales. Antes del 2026-10-01 estos campos contenían valores en CNY (entonces ledger_currency era "CNY"), así que los scripts que concilian con ledger_currency o con los campos _cny / _usd no necesitan cambios.

Una clave con cuota propia sigue descontando del saldo de la cuenta: si la cuenta se queda sin saldo antes, las solicitudes devuelven 402 aunque aquí balance muestre cuota disponible.

Este endpoint no usa el cuerpo de error estándar. Los fallos tienen este aspecto:

CasoEstadomessage
Sin clave, o clave que no empieza por sk-401"missing or invalid api key"
Clave desconocida o desactivada401"invalid api key"
Clave caducada200"api key expired"
Miembro del equipo desactivado200"member disabled"

El cuerpo completo del primer caso 401:

{"is_active": false, "balance": 0, "message": "missing or invalid api key"}

Los dos casos 200 también incluyen ledger_currency y balance_cny / balance_usd (ambos 0).

Decida según is_active, no solo según el estado HTTP. Para el detalle de cada cargo, abra Consumo en la consola.

Cargos por solicitud, tarea y registro

Las solicitudes síncronas y las tareas asíncronas informan cada cargo en dos monedas: cost_usd es el importe en USD que se descuenta realmente de su saldo, el mismo que el registro en Consumo de la consola; cost es el mismo cargo en CNY y se mantiene en CNY para que las integraciones existentes sigan funcionando, por eso currency siempre es CNY. cost_usd tiene hasta 8 decimales; cost se redondea a 6.

Solicitudes síncronas (chat, imágenes, voz)

Una solicitud síncrona facturada devuelve su cargo real en tres encabezados de respuesta:

EncabezadoSignificado
X-HopBase-CostEl cargo de esta solicitud en CNY (el mismo cargo que X-HopBase-Cost-USD), por ejemplo 0.0816
X-HopBase-Cost-USDEl importe en USD que se descuenta realmente de su saldo por esta solicitud, el mismo que su registro de uso, por ejemplo 0.012
X-HopBase-CurrencyLa moneda de X-HopBase-Cost, siempre CNY

Una respuesta JSON sin streaming también incluye los mismos cost, cost_usd y currency en el usage de nivel superior:

{
  "id": "chatcmpl-abc",
  "object": "chat.completion",
  "model": "gpt-5.6-sol",
  "choices": [{ "index": 0, "message": { "role": "assistant", "content": "ok" }, "finish_reason": "stop" }],
  "usage": { "prompt_tokens": 9, "completion_tokens": 1, "total_tokens": 10, "cost": 0.001197, "cost_usd": 0.000176, "currency": "CNY" }
}
  • Si la respuesta no tiene usage, se añade uno, como en la respuesta JSON de síntesis de voz POST /v1/t2a_v2. Los campos que ya tenía usage, como cost_in_usd_ticks de xAI, no cambian.
  • Si usage ya tiene cost, cost_usd o currency, o no es un objeto, el cuerpo se deja igual. Lea los encabezados.
  • Las respuestas binarias, como el audio de síntesis de voz, solo llevan los encabezados.
  • Las respuestas en streaming (SSE) no llevan ninguno: los encabezados se envían antes de que empiece la generación y el evento final de uso se reenvía sin cambios. Consulte el cargo de una solicitud en streaming en Uso de la consola.
  • Cuando la generación de una imagen tarda más de unos 40 segundos, el servidor envía primero los encabezados 200 y luego escribe espacios en blanco para mantener la conexión, así que los encabezados no llevan el cargo. Lea usage.cost / usage.cost_usd en el cuerpo.
  • Las respuestas sin cargo, como las listas de modelos y los errores no facturados, no llevan ninguno. Si una solicitud fallida se factura igualmente, su respuesta de error lleva los encabezados y el cuerpo del error no cambia.
  • Cuando HopBase reintenta una solicitud automáticamente, solo se factura el intento que se completa, y ese es el importe que se informa. Una clave con varios grupos se cobra según el grupo que atendió la solicitud.
  • En una clave con multiplicador de venta, el importe es lo que se descontó de su saldo, sin el margen.
  • Si el cliente se desconecta antes de recibir la respuesta, la solicitud se factura igualmente por lo que se usó; el cargo aparece en Uso.

Consultas de tareas asíncronas (imagen y video)

Cuando la tarea termina, el usage de nivel superior incluye cost_usd (el importe en USD que se descuenta realmente de su saldo por esta tarea), cost (el mismo cargo en CNY) y currency (la moneda de cost, siempre CNY). 0 significa un fallo sin cargo; al consultar una sola tarea, solo la clave que la creó ve estos campos.

{
  "id": "vt-1",
  "status": "completed",
  "usage": { "cost": 3.4, "cost_usd": 0.5, "currency": "CNY" }
}

En las listas de tareas (como GET /v1/video/tasks sin ID de tarea), cada tarea finalizada lleva los mismos cost, cost_usd y currency en su usage. Las listas abarcan toda la cuenta, así que las tareas creadas con otras claves de la misma cuenta también llevan el importe.

Registros de consumo en la consola

La página Consumo lee GET /api/v1/user/usage y GET /api/v1/user/usage/stats (sesión de la consola, no una clave sk-).

Cada registro incluye ledger_currency (USD desde el 2026-10-01), cost_cny y cost_usd: el importe cobrado por ese registro en CNY y en USD. La página muestra USD.

Las estadísticas incluyen ledger_currency, total_charged_cny y total_charged_usd, y cada elemento de by_model, by_key, by_group, by_department y by_member incluye cost_cny / cost_usd.

El campo antiguo total_cost de las estadísticas es el precio oficial de lista en USD antes de la tarifa de su grupo, no lo que se le cobró; para el cargo use total_charged_*.

Catálogo público de modelos

curl https://api.hop-base.com/api/v1/models/pricing

No requiere clave. La respuesta admite solicitudes de origen cruzado desde cualquier sitio y puede almacenarse en caché hasta 5 minutos (Cache-Control: public, max-age=300). Los precios son los de lista en USD antes de la tarifa de su grupo; lo que usted paga realmente por cada modelo aparece en el catálogo de modelos con la sesión iniciada.

{
  "code": 0,
  "message": "ok",
  "data": [
    {
      "platform": "openai",
      "models": [
        {
          "id": "gpt-6-astra",
          "name": "GPT-6 Astra",
          "context_window": 1050000,
          "capabilities": ["chat", "reasoning"],
          "vendor": "openai",
          "category": "chat",
          "input": 10,
          "cached_input": 1,
          "output": 50,
          "long_context": {
            "threshold": 272000,
            "input_multiplier": 2,
            "cached_multiplier": 2,
            "output_multiplier": 1.5
          },
          "price_unit": "token"
        }
      ]
    },
    {
      "platform": "minimax",
      "models": [
        {
          "id": "speech-2.8-hd",
          "name": "MiniMax Speech 2.8 HD",
          "capabilities": ["tts"],
          "vendor": "minimax",
          "series": "minimax-speech",
          "category": "audio",
          "input": 100,
          "output": 0,
          "price_unit": "character"
        }
      ]
    }
  ]
}
CampoTipoSignificado
codeinteger0 si todo va bien
data[].platformstringFamilia de integración que sirve el modelo, no el fabricante
models[].idstringID de modelo que se envía
models[].namestringNombre visible
models[].vendorstringFabricante del modelo, por ejemplo openai, google; puede faltar
models[].seriesstringFamilia con la que la consola agrupa versiones; puede faltar
models[].categorystringchat, image, video, audio o embedding
models[].capabilitiesstring[]Por ejemplo chat, reasoning, image_generation, image_edit, video_generation, tts
models[].context_windowinteger, tokensAusente si no está publicado
models[].price_unitstringUnidad de todos los precios de la entrada; vea la tabla
models[].input, cached_input, outputnumber, USD por price_unitcached_input falta cuando no aplica la caché. Los modelos de voz usan solo input
models[].long_contextobjectPresente cuando hay tramo de contexto largo; vea debajo
models[].imageobjectPrecio por imagen según el tramo de resolución, por ejemplo {"1k": …, "2k": …, "4k": …}
models[].video_tokensobjectPrecio de video por tramo; la unidad sigue a price_unit

platform es, por ejemplo, openai, claude, gemini o kling; para el fabricante del modelo, vea vendor.

price_unitPrecio por
token1M de tokens
secondsegundo de video
imageimagen
character1M de caracteres facturables

Por encima de threshold tokens de entrada, toda la solicitud se factura con input_multiplier / cached_multiplier / output_multiplier.

Los tramos de video_tokens son resolución, audio y medios de referencia. La unidad es por 1M de tokens de video con token y por segundo con second. El nombre de la clave es histórico.

Un modelo puede aparecer bajo más de un platform cuando se ofrece en más de un grupo. Pueden añadirse campos nuevos; ignore los que no reconozca.

Encabezados de respuesta

EncabezadoSe envía enSignificado
x-request-idTodas las respuestasID de esta solicitud. Inclúyalo al informar de un problema
Retry-After429 por el límite de concurrencia; 429 y 503 cuando se conoce el tiempo de esperaSegundos que esperar antes de reintentar
Retry-After-Ms429 por el límite de concurrencia y otros 429 con espera conocidaLa misma espera en milisegundos
X-HopBase-CostSolicitudes síncronas facturadas (sin streaming)El cargo de esta solicitud en CNY; vea Cargos
X-HopBase-Cost-USDIgual que X-HopBase-CostEl importe en USD que se descuenta realmente de su saldo
X-HopBase-CurrencyIgual que X-HopBase-CostLa moneda de X-HopBase-Cost, siempre CNY

HopBase no envía encabezados con su límite de concurrencia, las solicitudes en curso ni el saldo restante. Use GET /v1/usage para el saldo y consulte Concurrencia, tiempos de espera y facturación para los límites. Algunas respuestas de modelos traen sus propios encabezados de límite de tasa (x-ratelimit-*, anthropic-ratelimit-*); no describen los límites de su cuenta ni de su clave, así que no regule el tráfico con ellos.

Próximos pasos