---
title: "Dry-run del import: valida el manifiesto y resuelve dependencias, sin crear nada. Body: { doc }"
method: POST
path: "/workspaces/{workspaceId}/functions/import/preview"
tags: ["Functions"]
---

# Dry-run del import: valida el manifiesto y resuelve dependencias, sin crear nada. Body: { doc }

`POST /workspaces/{workspaceId}/functions/import/preview`

## Request

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

Dry-run: valida el manifiesto y te dice qué dependencias hay que resolver, sin crear ni modificar nada. Corre esto antes de importar para saber qué mandarle.

## Path parameters

- `workspaceId` number, required

## Request body

- FunctionImportRequestDto
  - `doc` FunctionPortableDocDto, required
    - `content_hash` string, required: Hash del JSON canónico de `{ function, dependencies }` — para detectar cambios.
    - `dependencies` FunctionDependencyDto[], required
      - `kind` 'workspace_variable' | 'flow', required
      - `name` string, required: Nombre humano con el que se resuelve en el workspace destino.
      - `origin_id` object, nullable, required: ID en el workspace de ORIGEN. Informativo; el destino resuelve por nombre.
      - `purpose` string, required: Para qué la usa la Función. Lo lee la persona que importa para saber qué tiene que crear antes.
      - `ref` string, required
    - `exported_at` string, required
    - `function` FunctionPortableBodyDto, required
      - `activo` boolean, required: Si la Función debería quedar activa. Al importar creando una Función NUEVA se fuerza a `false` — nada que llega en un documento empieza a atender clientes sin que una persona lo mire, mismo criterio que el flujo importado que aterriza como draft.
      - `descripcion` string, required
      - `flow_ref` string, nullable, required: `null` cuando el handler es HTTP. Cuando es un flujo, acá va el **marcador** de la dependencia (`@snapshot:flow:<ref>`), no el UUID de origen: el UUID no existe en el workspace destino.
      - `function_prompt` string, required
      - `http` FunctionHttpConfigDto, required
        - `auth_workspace_variable` string: Nombre de la variable del workspace que guarda el Bearer token. El token en sí no se devuelve nunca.
        - `headers` object: Headers estáticos **no sensibles**. `Content-Type` lo pone Meteor solo si hay cuerpo JSON.
        - `last_probe` FunctionProbeResultDto
          - `checked_at` string, required
          - `code` string, nullable, required: Código de máquina del hallazgo, en inglés. `null` cuando todo salió bien.
          - `duration_ms` number, required
          - `http_status` number, nullable, required: Status HTTP de la respuesta. `null` si no hubo respuesta.
          - `message` string, required: Qué pasó, en español, para el developer.
          - `method` string, nullable, required: Método HTTP que se usó. `null` si no se llegó a mandar nada.
          - `mode` 'safe' | 'invoke' | 'off', required: Modo con el que se probó. Ver `FunctionHttpConfigDto.probe`.
          - `status` 'ok' | 'warning' | 'unreachable' | 'blocked' | 'skipped', required
        - `method` 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'
        - `probe` 'safe' | 'invoke' | 'off': Qué tan lejos puede llegar la **prueba de humo** que Meteor corre al registrar o cambiar el endpoint. - `safe` (default): `HEAD` y, si hace falta, `OPTIONS`. Sin cuerpo, así que tu handler no recibe ningún argumento sobre el que actuar. Es lo único seguro contra un endpoint del que Meteor no sabe nada. - `invoke`: manda tu método configurado con el cuerpo `{"__met_probe":true}` y el header `X-Met-Probe: 1`. **Elígelo solo si tu endpoint es idempotente o reconoce esa marca**: si no, la prueba ejecuta tu lógica de verdad. - `off`: no se prueba nada.
        - `sign_secret_variable` string: Nombre de la variable del workspace con el secreto que firma `X-Met-Signature`. El secreto en sí no se devuelve nunca. Omitirla **no** deja la llamada sin firmar: Meteor firma igual, con el secreto administrado del workspace (variable `MET_TOOL_SIGN_SECRET`, que crea sola la primera vez). Este campo solo sirve para elegir otro secreto.
        - `timeout_ms` number: Timeout de la llamada, en milisegundos. Default 30 000, tope 60 000.
        - `url` string, required: Endpoint del cliente que se invoca cuando el Met usa la tool.
      - `nombre` string, required
      - `parameters` FunctionParameterDto[], required
        - `description` string, required: Qué es el parámetro. El Met lo lee para saber qué recolectar.
        - `enum_values` string[], nullable, required: Valores permitidos (enum del JSON schema). `null` = valor libre.
        - `memory` boolean, required: Flag "Memoria" heredado de uChat. Se persiste; reservado para uso futuro.
        - `name` string, required: Nombre EN INGLÉS — entra al JSON schema de la tool como propiedad.
        - `required` boolean, required: `true` = el Met no puede invocar la tool sin este valor.
        - `save_to` string, nullable, required: `field_key` del contacto (o `workspace.<nombre>`) donde persistir el valor que el Met recolectó. `null` = no se guarda en ningún lado.
        - `type` 'string' | 'number' | 'boolean', required: Tipo del parámetro en el JSON schema de la tool.
      - `ref` string, required
      - `required_tools` string[], required
      - `version` number, required: Versión del contrato invocable en el origen. Ver `FunctionResponseDto.version`.
    - `kind` 'meteor.function', required
    - `schema_version` number, required
    - `source` FunctionPortableSourceDto, required
      - `function_ref` string, required
      - `workspace_id` number, required
  - `flow_binding` string: ID del flujo local que atiende la Función, cuando el manifiesto trae `flow_ref`. Sin esto la Función se importa sin handler y desactivada.
  - `target_function_id` number: Actualiza esta Función en vez de crear una nueva. Es lo que hace el import idempotente en un pipeline que corre en cada despliegue.

## 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` FunctionImportPreviewResponseDto, required
    - `dependencies` FunctionImportPreviewDependencyDto[], required
      - `kind` 'workspace_variable' | 'flow', required
      - `local_id` union, required: ID local si se resolvió por nombre.
        - string
        - number
      - `name` string, required: Nombre humano con el que se resuelve en el workspace destino.
      - `origin_id` object, nullable, required: ID en el workspace de ORIGEN. Informativo; el destino resuelve por nombre.
      - `purpose` string, required: Para qué la usa la Función. Lo lee la persona que importa para saber qué tiene que crear antes.
      - `ref` string, required
      - `status` 'resolved' | 'unresolved', required: `unresolved` = no existe en el destino; hay que crearla antes de que sirva.
    - `existing_function_id` number, nullable, required: ID de la Función local con el mismo nombre. Pásalo como `target_function_id` al importar para **actualizarla** en vez de crear un duplicado (idempotente).
    - `function_name` string, required
    - `name_collision` boolean, required: Ya existe una Función con ese nombre en el destino.
    - `parameter_count` number, required
    - `tool_name` string, required: Nombre de tool con el que el Met la va a ver.
    - `warnings` string[], required: Cosas que hay que mirar antes de importar.

## 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.
- `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)
