En esta sección
Guías / Autenticación

Autenticación

Cómo crear tu API key, qué son los scopes y cómo mantener la key segura.

Actualizada el Ver .md

La API de Meteor se autentica con una API key secreta. Cada request lleva la key en el header Authorization, y la key define a qué workspace pertenece y qué puede hacer (sus scopes).

Formato de la key

Todas las keys empiezan con un prefijo que indica su tipo:

La key es un secreto de servidor. Nunca la pongas en el navegador, en una app móvil, ni la subas al control de versiones. Si se filtra, revócala desde el panel y genera una nueva.

Crear una key

Desde tu panel de Meteor: Ajustes → Desarrolladores → Crear API key. Eliges los scopes que necesita y el entorno (live o test). La key se muestra una sola vez — guárdala apenas la creas.

Puedes crear y administrar keys aunque el workspace todavía no tenga plan. Para usarlas, el workspace necesita un plan mensual vigente de Meteor; un trial o un plan bonificado también habilitan la operación. Los Tech Partners aprobados pueden recibir un plan especial de USD 0 de cargo fijo mensual, habilitado únicamente por Meteor, con la Energía a tarifa premium.

Usar la key

Guárdala en una variable de entorno, nunca hardcodeada:

export MET_API_KEY=met_live_tu_key_aqui

Con el SDK:

import Met from '@meteor.ia/sdk';

const met = new Met(process.env.MET_API_KEY, { workspaceId: 7 });
import os
from meteor_ia import Met

met = Met(os.environ["MET_API_KEY"], workspace_id=7)

Con curl, la key va como Bearer token:

curl https://api.met.meteor.com.co/api/v1/workspaces/7/runs \
  -H "Authorization: Bearer $MET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":"Hola"}'

Saber con qué identidad estás entrando

Una key no dice de quién es con solo mirarla. Para preguntárselo al servidor está GET /me: devuelve la identidad que la API le reconoce a la key con la que llamas — quién es el dueño, qué workspace opera, con qué scopes y en qué entorno.

curl https://api.met.meteor.com.co/api/v1/me \
  -H "Authorization: Bearer $MET_API_KEY"
const yo = await met.me.retrieve();
console.log(yo.workspace?.id, yo.api_key.scopes, yo.livemode);
yo = met.me.retrieve()
print(yo["workspace"]["id"], yo["api_key"]["scopes"], yo["livemode"])

La respuesta, tal como llega por el cable. Toda respuesta correcta de la API viaja dentro de un sobre y el recurso está en data:

{
  "success": true,
  "data": {
    "object": "identity",
    "livemode": true,
    "api_key": {
      "id": "key_01HXYZ",
      "object": "api_key",
      "owner_type": "workspace",
      "env": "live",
      "scopes": ["items:read", "runs:execute", "runs:read"],
      "rate_limit_rpm": 120,
      "monthly_quota": null
    },
    "workspace": { "object": "workspace", "id": 7, "slug": "acme" },
    "partner": null
  }
}

Los SDK oficiales te entregan directamente el contenido de data, por eso en los ejemplos de arriba yo es el objeto de adentro. Si llamas con curl o con un cliente propio, lee .data. Un cliente generado del contrato ya lo sabe: el OpenAPI declara el sobre. Ver Errores e idempotencia.

Qué hacer con cada campo:

CampoPara qué te sirve
api_key.idIdentifica la fila en el panel y en los logs de request. No es el secreto y no autentica nada: puedes pegarlo en un ticket de soporte sin riesgo.
api_key.owner_typeworkspace si la key es de un cliente, partner si es de un Tech Partner.
api_key.scopesLo que la key puede hacer, según el servidor. Si una llamada te responde 403 missing_scope, esta es la lista contra la cual compararla.
livemode / api_key.envSi lo que hagas tiene efecto real. Míralo aquí y no en el prefijo de la key: es el mismo criterio que aplica el servidor.
workspace.idEl workspace que este request opera. Con una key de workspace es siempre el suyo; con una de partner, el cliente atribuido que estás operando.
partner.idEl partner dueño de la key, o null.
rate_limit_rpm · monthly_quotaLos topes que se te aplican de verdad: el más estricto entre el de la key y el de tu plan. null es sin tope. Son los números detrás de un 429.

El endpoint nunca devuelve el secreto de la key, ni su prefijo, ni sus últimos caracteres, ni su longitud. Si perdiste la key, no la recuperas aquí: se crea una nueva en el panel.

GET /me pide el scope identity:read, que toda key tiene sin marcarlo: cualquier key válida puede preguntar quién es, aunque no traiga ningún otro scope. Hasta la versión 3.27.0 pedía runs:read.

Desde la terminal

met whoami imprime lo mismo, y con --save-workspace guarda en tu config local el workspace que el servidor resolvió, para que no tengas que pasar --workspace en cada comando:

met whoami
met whoami --save-workspace
met whoami --json

Si tu config local apunta a un workspace y la key opera otro, met whoami te lo dice: es el error que más tiempo hace perder, porque todo responde 200 y los datos simplemente no son los que esperabas.

Scopes

Una key solo puede hacer aquello para lo que tiene scope. Los scopes siguen el patrón dominio:acción, donde :write cubre crear, editar y borrar (no existe un :update aparte). Pide solo los que tu integración necesita: es más seguro.

Estas tablas salen del catálogo de scopes de la API y del contrato OpenAPI. La columna Endpoints dice cuántas operaciones REST piden ese scope hoy.

Un — en Endpoints significa que hoy ninguna operación REST pide ese scope. Sigue siendo válido: una key que ya lo tenga no deja de funcionar.

Ojo con conversions:read: sin endpoints REST, pero con eventos de webhook detrás. Para suscribir un endpoint a esos eventos, el scope hace falta.

rag:read, rag:write y sites:read ya no se ofrecen al emitir una key nueva ni al registrar una app OAuth. Las keys que los tengan guardados siguen igual; simplemente no habilitan ninguna llamada.

partner:community:read no habilitan ninguna llamada extra.

Ejecución de Mets

ScopePermiteEndpoints
agents:readVer Mets6
agents:writeCrear y configurar Mets11
runs:executeEjecutar Mets — consume Energía2
runs:readLeer runs e historial2
skills:readVer skills9
skills:manageCrear, editar y quitar skills12
functions:readVer Funciones IA (código y tools del Met)5
functions:writeCrear y editar Funciones IA6
rag:readConsultar colecciones indexadas—
rag:writeIndexar contenido para consultarlo después—
flows:writeCrear, editar, duplicar y archivar flujos6
automations:readVer disparadores14
automations:writeCrear, editar y borrar disparadores7
automations:executeDisparar automatizaciones4

Datos

ScopePermiteEndpoints
collections:readLeer colecciones13
collections:writeCrear, editar y borrar colecciones22
items:readLeer ítems9
items:writeCrear, editar y borrar ítems27
contacts:readLeer contactos del CRM12
contacts:writeCrear, editar y borrar contactos17
tasks:readLeer tareas agénticas (los pasos que ejecuta un Met)7
tasks:writeCrear, editar y borrar tareas16
variables:readLeer variables del workspace5
variables:writeCrear, editar y borrar variables6
files:readLeer archivos y mediateca2
files:writeSubir y borrar archivos7
business:readLeer Mi negocio: descripción y prompt del negocio1
business:writeCambiar la descripción y el prompt del negocio1

Conversaciones y canales

ScopePermiteEndpoints
conversations:readLeer conversaciones de WhatsApp y del CRM10
conversations:writeCrear y editar atajos del chat3
handoff:managePiloto automático, asignación y mensaje de operador4
channels:readEstado de canales y difusiones8
channels:sendEnviar por WhatsApp y difusiones13
channels:manageCrear y borrar plantillas de WhatsApp3
channels:writeConfigurar canales: alias y flujo de entrada de cada línea de WhatsApp. No cambia nada en Meta1

Integraciones y plataforma

ScopePermiteEndpoints
integrations:readVer integraciones MCP3
integrations:manageActivar integraciones y guardar sus credenciales3
integrations:executeEjecutar tools de integración1
images:generateGenerar y editar imágenes y video (debita Energía)3
identity:read«Quién soy» (GET /me). Toda key lo tiene sin marcarlo1
mcp:useAbrir sesión en el servidor MCP2
webhooks:manageWebhooks entrantes y suscripciones a eventos salientes21
events:readEventos del workspace: en vivo y del registro6
reminders:readVer recordatorios1
reminders:writeCrear, editar y borrar recordatorios3
billing:readPlan y consumo (no existe un billing:write)12
members:readVer el equipo del workspace: id, nombre, correo, rol y si está activo. Sin datos de acceso1
conversions:readEstado y configuración de conversiones, y los eventos conversion.sent y conversion.discarded—
conversions:writeReportar una conversión a Meta (CAPI)2
sites:readVer sitios web—
snapshots:readNavegar el catálogo de plantillas y ver las propias2
snapshots:installInstalar una plantilla en el workspace2

Solo para keys de partner

Estos scopes no se pueden emitir en una key de workspace: el servidor lo re-verifica en cada request y responde 403. Ver la API de Partners.

ScopePermiteEndpoints
snapshots:publishPublicar una plantilla al marketplace1
workspaces:provisionCrear cuentas de cliente3
workspaces:rechargeCargar energía a una cuenta que aprovisionaste1
partner:billing:manageEl medio de pago del partner, con el que paga las cuentas que gestiona2
partner:clients:readClientes atribuidos1
partner:leads:readVer oportunidades4
partner:leads:writeCrear, editar, mover y borrar oportunidades7
partner:projects:readVer proyectos de implementación5
partner:projects:writeCrear y editar proyectos, tareas, hitos y avance de fase10
partner:commissions:readComisiones (siempre solo lectura)1
partner:payouts:readLiquidaciones (siempre solo lectura)2
partner:support:readTickets propios y de los clientes de su cartera3
partner:support:writeAbrir tickets, responder y cambiar de estado3
partner:community:readVer la sesión semanal de la Comunidad de Partners—

Qué hace y qué no hace el modo de prueba

Una key met_test_ no puede ejercer scopes con efecto externo real: integrations:execute, images:generate, channels:send, conversions:write, channels:manage, workspaces:provision, workspaces:recharge, partner:billing:manage y snapshots:install responden 403 con test_mode_restricted. La restricción vale igual por REST y por el servidor MCP: una herramienta cuyo scope está restringido ni siquiera aparece en el catálogo que ve tu agente.

Eso, más el costo, es todo lo que el modo de prueba te separa de producción:

Con una key met_test_
Energía de los runsNo se debita: el run queda registrado con costo cero.
Cuántos runsHay un tope diario de runs de prueba por workspace. Al alcanzarlo, 429 con test_run_daily_cap. Tu plan puede subir ese tope, o dejarlo en cero.
Efectos externosLos scopes de arriba responden 403 test_mode_restricted.
livemodefalse en el recurso run y en los eventos que ese run produce.
Dónde viven los datosEn la misma base y las mismas tablas que producción. No hay copia, ni espejo, ni entorno aparte.
Contactos, ítems, colecciones, tareas, archivosReales. Si la key lleva items:write, tus pruebas crean ítems que tu equipo ve en el panel.
DeshacerNo hay. Nada se revierte cuando la key vence o se revoca.

Solo dos cosas llevan la marca livemode y por eso se pueden distinguir después: los runs y los eventos. Todo lo demás que escribas con una key de prueba queda indistinguible de lo que escribió tu producción, así que tampoco hay forma de pedir "bórrame lo de prueba": esos registros se borran uno por uno, como cualquier otro.

La única excepción se limpia sola: un run sin conversation_id corre en una conversación efímera, y esas se purgan a los pocos días — vengan de una key de prueba o de una viva.

Para probar sin tocar tus datos, de menos a más trabajo:

  1. Emite la key de prueba solo con scopes de lectura (más runs:execute si vas a ejecutar Mets). Es una decisión de una línea al crearla y cierra el problema entero: lo que no tiene scope de escritura no escribe.
  2. Usa un workspace aparte para desarrollo y emite ahí la key de prueba. Es lo más cercano a un entorno separado que existe hoy, y es lo que puedes borrar entero cuando ya no lo necesites.
  3. Mira primero la forma de las respuestas con la clave de demostración del portal: no pide registro, corre contra un negocio ficticio y es de solo lectura. Está en la portada, en *¿Prefieres no registrarte todavía?*.

Si una key intenta algo fuera de sus scopes, la API responde 403 con el código missing_scope (el campo param trae el scope faltante). No reintentes: pide al dueño de la key que amplíe los scopes.

Revocar

Una key revocada deja de funcionar en menos de 60 segundos. Revoca y rota keys ante cualquier sospecha de filtración, y usa keys distintas por entorno (una para test, otra para producción).

Apps que operan varios workspaces

Si construyes una app que deben conectar otros workspaces, no les pidas una API key. Registra una app OAuth en tu panel: Ajustes → Desarrolladores → Apps OAuth. El usuario ve los scopes y autoriza (o revoca) el acceso de tu app.

Sigue la guía de OAuth para apps de terceros: usa Authorization Code con PKCE S256, callbacks exactos y refresh tokens rotativos.