Saltar al contenido

OpenAI Decisions API: qué es, por qué da 403 y qué usar hoy

Elige entre respuestas que tú defines, pero solo tienen acceso clientes seleccionados. Con GPT-6 Luna y un enum estricto puedes lanzar ya la misma decisión.

A
AI Free API Team
••10 min de lectura•Guías de API
Dos bloques sobre una plataforma: Decisions API en ámbar, marcada como vista previa con un candado, y GPT-6 Luna en verde, marcada como disponible

Qué es Decisions API: GPT-6 Luna elige entre respuestas cerradas

Decisions API es un endpoint que OpenAI anunció en el DevDay del 29 de septiembre de 2026 para un único trabajo: recibir un contexto (texto o imágenes) junto con preguntas que tú defines, cada una con una lista cerrada de respuestas posibles, y devolver la respuesta elegida. Según el anuncio del DevDay en el foro de desarrolladores de OpenAI, «usa Luna para clasificar entradas, enrutar peticiones o elegir una acción entre respuestas predefinidas». No redacta nada: elige.

A 6 de octubre de 2026, la situación es esta:

PreguntaRespuesta a 6 de octubre de 2026
¿Puedo usarla con mi clave de API?Solo si OpenAI te ha incluido en la vista previa limitada. Con una clave normal, la ruta v1/decisions devolvió un 403 en las pruebas que eesel hizo el 1 y el 2 de octubre
¿Hay documentación?No. En developers.openai.com no hay guía, referencia, esquema de petición ni fila de precios
¿Cuánto cuesta?Precio sin publicar. La única referencia es GPT-6 Luna: 0,10 $ por millón de tokens de entrada y 0,50 $ por millón de salida
¿Qué hago si necesito lanzar ya?Monta la misma decisión con GPT-6 Luna, Structured Outputs y una enumeración (enum) estricta, dentro de una función que puedas sustituir cuando Decisions API abra

Los tres usos que cita OpenAI cubren casi todas las bifurcaciones pequeñas de un producto: clasificar contenido (intención de un ticket, spam, si un texto infringe tus normas), enrutar peticiones (a qué cola, equipo o modelo va cada mensaje) y elegir la siguiente acción de un agente (buscar el pedido, pedir una aclaración, responder o pasar a una persona). Que admita imágenes importa si tus entradas son capturas de pantalla o fotos de productos dañados.

Qué ha publicado OpenAI y qué falta a 6 de octubre de 2026

Lo publicado cabe en pocas líneas. El resumen del DevDay, citado por eesel, dice que está «disponible hoy en vista previa limitada, con una apertura amplia prevista en los próximos días», y la cuenta OpenAI Developers añadió que el acceso «se limita a clientes de API seleccionados para pruebas». Una semana después de ese «próximos días» no hay anuncio de apertura, y en r/OpenAI siguen abriéndose hilos como «Where's the Decisions API?».

AspectoEstado a 6 de octubre de 2026
ModeloGPT-6 Luna, según el anuncio. No se sabe si es el mismo gpt-6-luna o una variante ajustada
EntradaTexto o imágenes como contexto, más tus preguntas con respuestas finitas
Salida«Una selección» entre tus respuestas; el formato exacto no está publicado
VelocidadThibault Sottiaux, de OpenAI, escribió en X que está ajustada para decidir «en menos de unos pocos cientos de milisegundos de extremo a extremo». Las cifras de 150 ms y «10 veces más rápido que Luna» solo aparecen en prensa, redes y una diapositiva de la presentación, no en la documentación
Puntuación de confianzaDesconocida. The New Stack afirma que la devuelve; eesel y Firecrawl no encontraron ninguna página ni publicación de OpenAI que lo diga
Esquema de petición y respuesta, método del SDK, ID de modeloSin publicar
Precio y unidad de facturación (por token, por llamada o por pregunta)Sin publicar
Límites de uso, preguntas u opciones por llamada, tamaño de imagenSin publicar
Residencia de datos y fecha de apertura generalSin publicar

La consecuencia práctica: cualquier «cuerpo de petición de Decisions API» que veas hoy en un tutorial es una suposición, y la velocidad es una promesa sin condiciones de medida. No diseñes umbrales alrededor de un campo de confianza que nadie ha documentado.

Error 403 «Decision API is not enabled for this user»: qué significa

Significa que tu clave no está habilitada para la vista previa. No es un fallo de tu código, y no hay nada en la petición que lo arregle.

La prueba pública más concreta es la de eesel: el 1 y el 2 de octubre de 2026, una clave de API estándar que llamaba a POST https://api.openai.com/v1/decisions recibió un HTTP 403 con el mensaje Decision API is not enabled for this user., mientras que rutas vecinas como /v1/decisions/create devolvían 404. Esa diferencia apunta a una ruta que existe pero está cerrada por permisos, no a una ruta inexistente. Como el 403 salta incluso con el cuerpo vacío, el error tampoco revela qué formato espera el endpoint.

Esquema de la prueba de eesel: POST /v1/decisions devuelve 403 «Decision API is not enabled for this user», /v1/decisions/create devuelve 404 y una petición vacía también recibe 403

Qué hacer si lo ves:

  • No reintentes con otros cuerpos ni cabeceras: el bloqueo es de cuenta, no de formato.
  • No busques el endpoint en pasarelas de terceros. Decisions API es un endpoint propio de OpenAI con acceso restringido; OrcaRouter, por ejemplo, indica que no lo enruta. Si alguien te vende «acceso a Decisions API», no puede respaldarlo.
  • España figura en la lista de países admitidos por la API de OpenAI, pero esa lista solo dice que puedes usar la API; no dice quién entra en la vista previa.
  • Vuelve a probar cuando aparezca una página de Decisions API en la documentación oficial. Si entonces sigues recibiendo el 403, tu cuenta aún no tiene acceso.

¿Esperar o lanzar ya? Depende de cuánta latencia aguantes

Si no estás en la vista previa, lanza con GPT-6 Luna. Esperar solo tiene sentido para quien necesita decisiones por debajo del segundo y puede aplazar el lanzamiento, e incluso en ese caso conviene prototipar ya con Luna para tener una línea base.

La diferencia que promete Decisions API es sobre todo de velocidad. En la prueba de eesel, Luna con razonamiento none y un enum estricto tardó una mediana de 1,46 s por decisión, medida de extremo a extremo desde un portátil; con razonamiento medium, 2,33 s. Frente a eso está la afirmación de OpenAI de «unos pocos cientos de milisegundos», sin ninguna medición independiente publicada.

Tu casoQué hacer ahora
Estás en la vista previa (tu clave no recibe 403)Pruébala con tráfico real, pero mantén Luna como respaldo: sin límites ni precio publicados no puedes dimensionar producción
Clasificación asíncrona: tickets, correos, moderación en colaLanza con Luna. Nadie nota si un ticket se etiqueta en 300 ms o en 1,5 s
Chat en directo o agente con muchas decisiones por tareaLanza con Luna detrás de una interfaz sustituible y mide. Un agente que toma 20 decisiones por tarea a 1,46 s cada una espera unos 29 s; ahí la velocidad prometida sí cambiaría la experiencia
Entradas con capturas o fotosLuna ya acepta imágenes; no necesitas esperar por esa capacidad
Necesitas una probabilidad por opción para fijar umbralesNi Luna con Structured Outputs ni Decisions API la ofrecen de forma documentada. Usa una opción «no_seguro» con revisión humana; si tu entrada es solo texto, Jev, de TypeSafe AI, devuelve probabilidades por opción y ya está disponible

Cómo montar la misma decisión con GPT-6 Luna y un enum estricto

GPT-6 Luna (gpt-6-luna) admite entrada de imágenes, Structured Outputs y reasoning.effort desde none hasta max, y funciona en Responses, Chat Completions y Batch, según su página de modelo. Con Structured Outputs en la Responses API, text.format de tipo json_schema y strict: true obliga a que la salida cumpla tu esquema; si ese esquema tiene un único campo con enum, la respuesta solo puede ser una de tus opciones (guía de Structured Outputs).

Necesitas Python 3.10 o superior, pip install openai y la variable de entorno OPENAI_API_KEY. El código sigue la forma documentada en la guía; haz una llamada de prueba con tus propios datos antes de ponerlo en producción.

python
import json
from openai import OpenAI

client = OpenAI()  # lee OPENAI_API_KEY del entorno

NO_SEGURO = "no_seguro"


def decidir(contexto: str, pregunta: str, opciones: list[str],
            imagen_url: str | None = None) -> str:
    """Devuelve exactamente una de `opciones` o NO_SEGURO.

    Hoy usa GPT-6 Luna con Structured Outputs. Cuando Decisions API
    tenga documentación, solo cambia el interior de esta función.
    """
    permitidas = opciones + [NO_SEGURO]

    contenido = [{"type": "input_text", "text": contexto}]
    if imagen_url:
        contenido.append({"type": "input_image", "image_url": imagen_url})

    respuesta = client.responses.create(
        model="gpt-6-luna",
        reasoning={"effort": "none"},
        input=[
            {
                "role": "developer",
                "content": (
                    f"{pregunta} Elige solo una opción. Si el contenido no "
                    f"permite decidir con seguridad, elige {NO_SEGURO}."
                ),
            },
            {"role": "user", "content": contenido},
        ],
        text={
            "format": {
                "type": "json_schema",
                "name": "decision",
                "strict": True,
                "schema": {
                    "type": "object",
                    "properties": {
                        "opcion": {"type": "string", "enum": permitidas}
                    },
                    "required": ["opcion"],
                    "additionalProperties": False,
                },
            }
        },
    )

    try:
        return json.loads(respuesta.output_text)["opcion"]
    except (json.JSONDecodeError, KeyError):
        # Negativa del modelo o respuesta incompleta: no actúes
        return NO_SEGURO


cola = decidir(
    contexto="Me habéis cobrado dos veces el pedido 4471.",
    pregunta="¿A qué cola debe ir este ticket?",
    opciones=["facturacion", "envios", "tecnico", "otro"],
)
print(cola)

Cuatro detalles hacen que este patrón aguante en producción:

  • La opción no_seguro va siempre en la lista. La guía advierte que el modelo intenta ajustarse al esquema incluso cuando la entrada no tiene nada que ver, y eso puede producir respuestas inventadas. Darle una salida explícita es más fiable que esperar a que se niegue.
  • Las reglas del esquema no son opcionales: con strict: true, todos los campos van en required y cada objeto necesita additionalProperties: false. Un esquema admite hasta 1.000 valores de enum en total.
  • reasoning.effort en none evita tokens de razonamiento y da la menor latencia. Súbelo a low solo si tus datos de prueba muestran errores, y mide la latencia de nuevo.
  • La función es la frontera. El resto de tu código solo conoce decidir(). El día que Decisions API publique su esquema, reescribes ese interior, comparas y cambias sin tocar la lógica que actúa sobre la respuesta.

Si llamas a Luna con Chat Completions, el mismo esquema va en response_format:

python
respuesta = client.chat.completions.create(
    model="gpt-6-luna",
    reasoning_effort="none",
    messages=[
        {"role": "developer", "content": "¿A qué cola debe ir este ticket? ..."},
        {"role": "user", "content": "Me habéis cobrado dos veces el pedido 4471."},
    ],
    response_format={
        "type": "json_schema",
        "json_schema": {"name": "decision", "strict": True, "schema": esquema},
    },
)
opcion = json.loads(respuesta.choices[0].message.content)["opcion"]

Aquí esquema es el mismo diccionario del bloque anterior. Esta variante es la que conviene si accedes a Luna a través de un proveedor compatible con OpenAI en lugar de la API oficial, por ejemplo laozhang.ai, cuyo catálogo de modelos lista gpt-6-luna a las mismas tarifas de 0,10 $ y 0,50 $ por millón de tokens (con base_url="https://api.laozhang.ai/v1" en el cliente). Antes de depender de él, comprueba con una llamada que respeta el esquema estricto. Ningún proveedor ofrece Decisions API: solo el modelo Luna.

Etiqueta válida no es etiqueta correcta: dónde poner la revisión humana

El modo estricto garantiza que la respuesta sea una de tus opciones, no que sea la acertada. La propia guía de Structured Outputs avisa de que las salidas estructuradas «pueden seguir conteniendo errores».

La prueba de eesel lo ilustra con 20 tickets de soporte y 160 llamadas en total. Luna eligió la cola correcta en 40 de 40 casos, pero a la pregunta «¿se puede responder automáticamente a este ticket?» acertó 33 de 40 sin razonamiento. Es una muestra pequeña de un proveedor que vende una herramienta de soporte, pero señala dónde está el riesgo: enrutar es la decisión fácil; saber cuándo no actuar es la difícil.

Flujo de una decisión con GPT-6 Luna y enum estricto: etiquetar, enrutar y priorizar se automatizan; cobrar, enviar, borrar o la opción no_seguro pasan a revisión humana

Reparte las decisiones según lo que cuesta un error:

Lo que provoca la decisiónCómo tratarla
Etiquetar, enrutar, priorizar (un error cuesta minutos)Automatiza. Revisa una muestra cada semana
Enviar un mensaje al cliente, cobrar, reembolsar, borrar o modificar datosSolo actúa con las opciones que lo autorizan de forma explícita; no_seguro y los casos dudosos van a una persona
Moderación con consecuencias para el usuario (bloqueos, suspensiones)Usa la decisión como filtro previo y deja la sanción final a revisión humana

Guarda en un registro cada entrada, la opción elegida, el modelo, el esfuerzo de razonamiento y la latencia. Ese registro es lo que te permitirá comparar Decisions API cuando abra: misma muestra, dos motores, tasa de acuerdo y tiempo por decisión.

Cuánto cuesta: Decisions API sin precio; con Luna, unos 47,50 $ por millón

OpenAI no ha publicado precio ni unidad de facturación para Decisions API, así que nadie puede decirte hoy lo que costará. Lo que sí puedes calcular es la alternativa con Luna, que en la página de GPT-6 Luna cuesta 0,10 $ por millón de tokens de entrada y 0,50 $ por millón de salida en Standard, con Batch y Flex al 50 %.

La fórmula por decisión es:

coste = tokens de entrada × 0,10 $ / 1.000.000 + tokens de salida × 0,50 $ / 1.000.000

Con un supuesto de 400 tokens de entrada (instrucciones, opciones y el texto del ticket) y 15 de salida (el JSON con la opción), sin tokens de razonamiento por usar none:

400 × 0,10 / 1.000.000 + 15 × 0,50 / 1.000.000 = 0,0000400 $ + 0,0000075 $ = 0,0000475 $ por decisión

Supuesto (Luna, razonamiento none)Por decisiónPor 1.000Por 1.000.000
400 de entrada + 15 de salida, Standard0,0000475 $0,0475 $47,50 $
800 de entrada + 15 de salida, Standard0,0000875 $0,0875 $87,50 $
400 de entrada + 15 de salida, Batch0,00002375 $0,02375 $23,75 $

Para calcular tu caso, sustituye 400 y 15 por los tokens reales que devuelve el campo usage de tus respuestas de prueba. Tres matices:

  • Las imágenes suman tokens de entrada según su tamaño; la tabla solo cubre texto.
  • Batch es asíncrono: sirve para reetiquetar históricos, no para decidir mientras el usuario espera.
  • El límite de peticiones también cuenta. En Tier 1, Luna admite 500 peticiones por minuto, es decir, unas 30.000 decisiones por hora como máximo.

Como contraste, eesel calculó unos 0,047 $ por cada 1.000 tickets en su prueba sin razonamiento, en el mismo orden que la primera fila. Ninguna de estas cifras es el precio de Decisions API. Si te planteas usar GPT-6 Sol para las decisiones difíciles, la comparación de GPT-6 Luna vs Sol: precio, coste por tarea y cuál elegir detalla cuándo compensa pagar más por token.

Cuándo pasarte a Decisions API: señales para reevaluar

Mantén Luna mientras no se cumpla al menos una de estas condiciones, y cuando se cumpla, compara con tu registro en lugar de cambiar a ciegas:

  1. Aparece una página de Decisions API en developers.openai.com (guía, referencia o fila en la tabla de precios). Lee el esquema y reescribe el interior de decidir().
  2. Tu clave deja de recibir el 403. Lanza la misma muestra contra los dos motores y compara acuerdo y latencia.
  3. Se publica el precio y la unidad de facturación. Compáralo con tu coste real por decisión con Luna, calculado con tus tokens.
  4. Se documenta un campo de confianza o probabilidad. Solo entonces tiene sentido sustituir la opción no_seguro por umbrales.
  5. Se publican límites de uso, de opciones por pregunta y de tamaño de imagen que encajen con tu volumen.
  6. Se aclara la residencia de datos. Luna ofrece residencia de datos en la UE con Standard, Flex y Batch; si tu producto la necesita, no migres hasta que Decisions API diga lo mismo.

Si ninguna se cumple, la versión con Luna sigue siendo tu sistema de producción, y lo único que cambias es el interior de una función cuando llegue el momento.

Preguntas frecuentes sobre Decisions API de OpenAI

¿Cuándo estará disponible Decisions API para todos?

No hay fecha. El 29 de septiembre de 2026 OpenAI habló de una apertura amplia «en los próximos días»; a 6 de octubre de 2026 no hay documentación ni anuncio de disponibilidad general, y el acceso sigue limitado a clientes seleccionados.

¿Qué aporta Decisions API frente a Structured Outputs?

Structured Outputs ya obliga a Luna a contestar con una opción de tu lista y está disponible para cualquier cuenta. Lo que promete Decisions API es más velocidad, según el personal de OpenAI, y una Luna «centrada» en decisiones acotadas. Si eso mejora también la precisión, no se sabe hasta que haya documentación y pruebas independientes.

¿Decisions API es la respuesta de OpenAI a Jev?

Llegó dos semanas después de Jev, el modelo de decisiones de TypeSafe AI lanzado el 15 de septiembre de 2026, y la mayoría de la cobertura los compara. Jev está disponible para todos, solo acepta texto y devuelve una probabilidad por opción; Decisions API acepta imágenes, pero no tiene documentación ni precio públicos.

¿Puedo acceder a Decisions API desde España?

España está entre los países admitidos por la API de OpenAI, así que puedes llamar a GPT-6 Luna directamente desde la API oficial. El acceso a Decisions API no depende del país sino de que OpenAI habilite tu cuenta en la vista previa.