---
title: "Ejecuta un Met (agente) del workspace"
method: POST
path: "/workspaces/{workspaceId}/runs"
tags: ["Runs"]
---

# Ejecuta un Met (agente) del workspace

`POST /workspaces/{workspaceId}/runs`

## Request

- Base URL: `https://api.met.meteor.com.co/api/v1`
- URL: `https://api.met.meteor.com.co/api/v1/workspaces/{workspaceId}/runs`
- Auth: one of:
  - `bearer` (a scheme the document does not define)
  - HTTP bearer

**El corazón del plano agéntico** y la llamada que debita Energía. Con `stream: false` (por defecto) responde el JSON del run ya terminado. Con **`stream: true` la respuesta deja de ser JSON**: pasa a ser un stream SSE de eventos `run.*`, y el esquema documentado acá describe solo el caso sin streaming. Elige streaming cuando quieras mostrar la respuesta palabra por palabra; si no, la forma simple alcanza.

## Path parameters

- `workspaceId` number, required

## Request body

- CreateRunDto
  - `attachments` string[]: Adjuntos de entrada (imágenes/archivos) para que el Met los "vea" — p.ej. una foto para clasificar o cotizar. Cada uno: `{ url, mime_type?, name?, kind? }`.
  - `conversation_id` number: Conversación existente para dar memoria al run. Sin ella → efímera.
  - `input` string, required
  - `met` string: Met a ejecutar directo: nombre (case-insensitive) o id de un Met del workspace. Bind directo, sin orquestador. Con `conversation_id` fija el default de la conversación (ver docstring de la clase). Si no matchea ningún Met → 400.
  - `stream` boolean: Respuesta SSE con los eventos del run en vivo.
  - `tool_policy` 'none': Ejecución aislada sin herramientas ni contexto dinámico del workspace. Requiere un Met válido; nunca usa el orquestador.

## Response `201`

- object: Sobre en el que viaja toda respuesta correcta de la API. El recurso está en `data`. Los SDKs oficiales lo desenvuelven por ti; un cliente hecho a mano tiene que leer `.data`.
  - `success` true, required: Siempre `true` en una respuesta 2xx.
  - `data` RunResponseDto, required
    - `completed_at` string, nullable, required: Cuándo llegó a un estado terminal. `null` si sigue en curso.
    - `conversation_id` number, nullable, required: Conversación en la que quedó el run, para darle continuidad al hilo.
    - `created_at` string, required
    - `energy` RunEnergyDto
      - `by_model` RunEnergyByModelDto[], required
        - `cost_usd` number, required: Energía consumida por este modelo, en USD.
        - `count` number, required: Cuántas ejecuciones de este modelo entraron en el run.
        - `model` string, required: Nombre de marca del modelo (`Ágil`, `Brillante`, `Genio`), no el id técnico.
      - `cost_usd` number, required: Total debitado por el run, en USD.
      - `executions` number, required: Cuántas ejecuciones de modelo hubo en total.
    - `error` string, nullable, required: Mensaje del fallo cuando `status` es `failed`; `null` en cualquier otro caso.
    - `events` RunEventDto[]: Los pasos del run. Vienen en el detalle (`GET /runs/{id}`) y al crearlo; **no** en el listado, que sería una respuesta enorme para nada.
      - `data` object, nullable, required: Contenido del paso. La forma depende del `type`, y el texto libre va topeado para no volcar payloads enteros en la respuesta.
      - `type` object, required: Qué pasó en este paso del run.
    - `id` string, required: ID del run, con prefijo `run_`.
    - `input` string, required: La instrucción que mandaste.
    - `livemode` boolean, required: `false` si el run lo disparó una key de test (`met_test_`): no debita Energía.
    - `met` string, nullable, required: Qué Met atendió el run. `null` si el orquestador no lo resolvió a uno concreto.
    - `metadata` object, required: Lo que mandaste en `metadata` al crear el run, tal cual.
    - `object` 'run', required: Siempre `run`. Sirve para distinguir el tipo de objeto en respuestas mezcladas.
    - `output` string, nullable, required: La salida del Met. `null` mientras el run no terminó, y si falló.
    - `status` 'queued' | 'running' | 'completed' | 'failed', required

## Other responses

- `400`: La request no es válida: un campo no pasa validación, falta un parámetro requerido o el recurso no admite la transición solicitada.
- `401`: API key ausente, inválida, revocada o expirada — o el workspace está bloqueado.
- `402`: El workspace se quedó sin Energía y esta operación la consume. No es un bloqueo de la cuenta: las lecturas y el resto de la API siguen respondiendo. Recarga Energía en la página que trae `error.recharge_url` (Facturación del panel) y reintenta; reintentar antes no cambia nada.
- `403`: La key está autenticada pero no puede ejecutar esta operación: scope faltante, capacidad deshabilitada, modo test restringido o recurso fuera de su cartera.
- `404`: El recurso no existe o no está disponible dentro del alcance de la key. No revela la existencia de recursos de otros tenants.
- `409`: La operación entra en conflicto con el estado actual o con un Idempotency-Key en uso. No reintentes con el mismo key y un body distinto.
- `429`: Se superó el límite por minuto de la key o la cuota del plan. Respeta `Retry-After`; el SDK ya reintenta solo.
- `500`: Error del servidor o del Met que ejecutaba. El SDK reintenta los 5xx con backoff.

---

[API](https://skmtc.dev/meteor/apis/met-public-api.md) · [All operations](https://skmtc.dev/meteor/apis/met-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/meteor/apis/met-public-api/revisions/fc6d3aad75de?raw)
