Documentación

English

Referencia de la API

Lee tus reuniones, notas y accionables de Mico por HTTPS con la API REST v1.

La API de Mico es una API REST de solo lectura para tus propios scripts, servidores e integraciones. Sirve las reuniones que ya sincronizas con Mico, desde la nube de Mico, así que funciona aunque la app de escritorio esté cerrada. Requiere un plan que incluya la API (Flow), y Mico comprueba el plan en cada petición.

La API lee los mismos datos que el servidor MCP remoto. Elige MCP para agentes de IA y la API para el código que escribes tú. Para que te avisen cuando pase algo en lugar de preguntar, usa webhooks.

Autenticación

  1. En la app de escritorio, abre Ajustes → Desarrolladores → MCP y crea un token de acceso personal. El token se muestra una sola vez; Mico solo guarda su hash.
  2. Envíalo como bearer token en cada petición:
curl -H "Authorization: Bearer mico_pat_..." \
  "https://<project>.supabase.co/functions/v1/api/v1/meetings?limit=5"

La URL base exacta aparece en Ajustes → Desarrolladores → API. Tiene esta forma:

https://<project>.supabase.co/functions/v1/api/v1

Los tokens son personales: un token solo lee las reuniones de la cuenta que lo creó. Revoca un token en la misma página de ajustes; deja de funcionar en la siguiente petición.

Un token de acceso personal lee todas tus reuniones y no caduca. Guárdalo en un servidor. La API no envía cabeceras CORS, así que los navegadores no pueden leer sus respuestas desde una página web.

Peticiones y respuestas

  • Todos los endpoints son GET. Cualquier otro método devuelve 405.
  • Toda respuesta correcta envuelve su contenido en data. Las listas añaden has_more y next_cursor.
  • Los valores ausentes son null, nunca un string vacío.
  • Las marcas de tiempo están en ISO 8601 y en UTC.
  • Pueden aparecer campos nuevos en cualquier objeto. Ignora los campos que no conozcas.
  • Cada respuesta lleva una cabecera X-Request-Id. Inclúyela cuando contactes con soporte.

Paginación

Los endpoints de lista devuelven primero lo más reciente y usan cursores:

  1. Pide la primera página, opcionalmente con limit (1–200, por defecto 50).
  2. Si has_more es true, pide la página siguiente con cursor igual al next_cursor que recibiste.
  3. Para cuando has_more sea false y next_cursor sea null.

Envía los mismos filtros en cada página. Los cursores son opacos: no los construyas ni los modifiques.

curl -H "Authorization: Bearer $MICO_TOKEN" \
  "$MICO_API/meetings?limit=100&cursor=eyJjIjoi..."

Endpoints

GET /v1/meetings

Tus reuniones, las más recientes primero según created_at. Las reuniones eliminadas quedan fuera.

ParámetroTipoPor defectoNotas
limitinteger50De 1 a 200.
cursorstring—next_cursor de la página anterior.
sincetimestamp—Solo reuniones creadas en este instante o después.
untiltimestamp—Solo reuniones creadas antes de este instante.

since y until deben incluir hora y zona horaria, por ejemplo 2026-10-01T00:00:00Z.

{
  "data": [
    {
      "id": "6f1c2a0e-...",
      "title": "Weekly sync",
      "kind": "meeting",
      "status": "active",
      "started_at": "2026-10-03T09:00:00+00:00",
      "ended_at": "2026-10-03T09:42:10+00:00",
      "created_at": "2026-10-03T08:59:58.412093+00:00",
      "updated_at": "2026-10-03T10:05:11.130045+00:00",
      "series_id": null
    }
  ],
  "has_more": true,
  "next_cursor": "eyJjIjoiMjAyNi0xMC0wM1QwODo1OTo1OC40MTIwOTMrMDA6MDAiLCJpIjoiNmYxYzJhMGUtLi4uIn0"
}

GET /v1/meetings/{meeting_id}

Una reunión con su nota, resúmenes, participantes y accionables. Una reunión que no existe, que se eliminó o que pertenece a otra persona devuelve 404 meeting_not_found.

ParámetroTipoPor defectoNotas
includestring—transcript añade la transcripción completa.
{
  "data": {
    "id": "6f1c2a0e-...",
    "title": "Weekly sync",
    "kind": "meeting",
    "status": "active",
    "started_at": "2026-10-03T09:00:00+00:00",
    "ended_at": "2026-10-03T09:42:10+00:00",
    "created_at": "2026-10-03T08:59:58.412093+00:00",
    "updated_at": "2026-10-03T10:05:11.130045+00:00",
    "series_id": null,
    "timezone": "Europe/Madrid",
    "language": "es",
    "note": {
      "id": "b2d0...",
      "kind": "note",
      "title": "Notes",
      "template_id": null,
      "text": "Budget approved.\nAna sends the minutes",
      "created_at": "2026-10-03T09:05:00+00:00",
      "updated_at": "2026-10-03T10:05:00+00:00"
    },
    "summaries": [
      {
        "id": "c81e...",
        "kind": "summary",
        "title": "Summary",
        "template_id": null,
        "text": "Decisions\nThe Q4 budget is approved.",
        "created_at": "2026-10-03T09:43:02+00:00",
        "updated_at": "2026-10-03T09:43:02+00:00"
      }
    ],
    "participants": [
      {
        "human_id": "a1f3...",
        "name": "Carla Ruiz",
        "email": "carla@example.com",
        "role": null,
        "job_title": "CFO"
      }
    ],
    "action_items": [
      {
        "id": "e4a9...",
        "text": "Send the minutes",
        "status": "todo",
        "assignee_human_id": "a1f3...",
        "due_at": null,
        "completed_at": null
      }
    ]
  }
}

El text de notas y resúmenes es texto plano con una línea por párrafo o encabezado. kind es summary para el resumen generado y template_output para un resumen hecho a partir de una plantilla.

Con ?include=transcript, la reunión también contiene:

"transcript": {
  "text": "Hi everyone\n\nGood morning",
  "segments": [
    { "id": "1d0e...", "track": "mic", "start_ms": 0, "end_ms": 25000, "text": "Hi everyone" },
    { "id": "7c3b...", "track": "speaker", "start_ms": 0, "end_ms": 25000, "text": "Good morning" }
  ]
}

start_ms y end_ms son desplazamientos desde el inicio de la grabación. track es mic para tu micrófono, speaker para el audio de los demás participantes y mixed cuando ambos se grabaron en una sola pista. La transcripción se devuelve entera, así que pídela solo cuando la necesites.

GET /v1/action-items

Tus accionables de todas las reuniones, los más recientes primero.

ParámetroTipoPor defectoNotas
limitinteger50De 1 a 200.
cursorstring—next_cursor de la página anterior.
statusstring—Separados por comas: todo, in_progress, done.
assignee_human_idstring—Solo los asignados a esta persona.
meeting_idstring—Solo los de esta reunión.
{
  "data": [
    {
      "id": "e4a9...",
      "text": "Send the minutes",
      "status": "todo",
      "assignee_human_id": "a1f3...",
      "due_at": null,
      "completed_at": null,
      "meeting": { "id": "6f1c2a0e-...", "title": "Weekly sync" }
    }
  ],
  "has_more": false,
  "next_cursor": null
}

meeting es null para un accionable que no salió de una reunión.

Endpoints de equipo

Tu token también lee lo que otras personas comparten contigo, incluido todo lo que se comparte con tus equipos. Ve exactamente lo mismo que tú ves en la app: deciden las mismas reglas, y dejas de ver las notas de un equipo en cuanto sales de él. Las notas llegan en su versión compartida (la nota y su resumen). Las transcripciones de reuniones de otras personas nunca se incluyen.

GET /v1/shared-notes

Notas que otras personas comparten contigo, las más recientes primero. Tus propias reuniones están en /v1/meetings.

ParámetroTipoPor defectoNotas
limitinteger50De 1 a 200.
cursorstring—next_cursor de la página anterior.
qstring—Solo notas cuyo título o texto contienen todas las palabras.
{
  "data": [
    {
      "id": "2d8f...",
      "title": "Pricing review",
      "team": { "id": "9b1e...", "name": "Acme" },
      "owner_name": "Bea Ruiz",
      "access": "viewer",
      "published_at": "2026-10-05T10:00:00Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

team es null cuando la nota se compartió contigo directamente y no con un equipo. access es viewer, commenter o editor.

GET /v1/shared-notes/{shared_note_id}

Una nota compartida con su texto.

{
  "data": {
    "id": "2d8f...",
    "title": "Pricing review",
    "team_name": "Acme",
    "published_at": "2026-10-05T10:00:00Z",
    "text": "We raise Flow in January\nNew price list goes out on the 15th"
  }
}

GET /v1/teams

Los equipos a los que perteneces.

{
  "data": [
    {
      "id": "9b1e...",
      "name": "Acme",
      "role": "member",
      "member_count": 4,
      "plan": "flow",
      "can_collaborate": true
    }
  ]
}

plan es null cuando el equipo no tiene un plan activo. Un equipo sin can_collaborate no tiene nada compartido que leer.

GET /v1/teams/{team_id}/action-items

Accionables de las notas compartidas con un equipo. El plan del equipo tiene que incluir los accionables de equipo.

ParámetroTipoPor defectoNotas
limitinteger50De 1 a 200.
statusstring—Uno de todo, in_progress, done.
{
  "data": [
    {
      "id": "e4a9...",
      "text": "Send the proposal",
      "status": "todo",
      "due_at": null,
      "assignee": "Ana",
      "owner_name": "Bea Ruiz",
      "created_at": "2026-10-04T10:00:00Z",
      "shared_note": { "id": "2d8f...", "title": "Planning" }
    }
  ]
}

assignee es el nombre escrito en la nota, no una cuenta de Mico. Abre el origen con GET /v1/shared-notes/{shared_note.id}.

Errores

Los errores usan un único envoltorio. Decide según code; el message puede cambiar.

{
  "error": {
    "code": "feature_not_included",
    "message": "Your plan does not include the Mico API",
    "feature": "public_api",
    "used": 0,
    "limit": null,
    "resets_at": null
  }
}
EstadocodeSignificado
400invalid_requestUn parámetro no es válido. param lo indica.
401unauthorizedNo hay token, no es un token mico_pat_ o es un token desconocido.
401token_revokedEl token se revocó. Crea uno nuevo.
402feature_not_includedTu plan no incluye la API.
402no_planTu cuenta no tiene un plan activo.
402quota_exhaustedSe agotaron las peticiones de este periodo de facturación. resets_at indica cuándo se renuevan.
404not_foundNo existe ese endpoint.
404meeting_not_foundNo hay ninguna reunión con ese ID en tu cuenta.
404shared_note_not_foundNo hay ninguna nota con ese ID compartida contigo.
404team_not_foundNo eres miembro de ese equipo.
402team_plan_requiredEl plan del equipo no incluye los accionables de equipo.
405method_not_allowedLa API solo acepta GET.
429rate_limitedDemasiadas peticiones en el último minuto. Espera los segundos que indique Retry-After.
500internal_errorAlgo falló en el lado de Mico. request_id identifica la petición.
503unavailableMico no pudo comprobar tu token o tu plan. Vuelve a intentarlo en breve.

Cuotas y límites de frecuencia

Cada petición que supera la autenticación y la validación de parámetros cuenta como una petición a la API, incluidas las que terminan en 404 meeting_not_found, 404 shared_note_not_found o 404 team_not_found con un ID bien formado. Las peticiones rechazadas con 400, 401, 404 not_found, 405 o 429 no cuentan, ni tampoco las que tu plan no cubre.

LímiteFlowEnterprise
Peticiones por periodo de facturación50.00050.000, o lo que diga tu contrato
Peticiones por minuto120120

Las respuestas correctas informan de la cuota del periodo de facturación en cabeceras:

CabeceraContenido
X-Quota-LimitPeticiones incluidas en este periodo de facturación.
X-Quota-RemainingPeticiones restantes en este periodo de facturación.
X-Quota-ResetCuándo se reinicia el recuento.

Si superas el límite por minuto, la API devuelve 429 rate_limited con una cabecera Retry-After. Espera esos segundos antes de reintentar.

Ejemplo: exportar todas las reuniones de octubre

MICO_API="https://<project>.supabase.co/functions/v1/api/v1"
cursor=""
while :; do
  page=$(curl -sf -H "Authorization: Bearer $MICO_TOKEN" \
    "$MICO_API/meetings?limit=200&since=2026-10-01T00:00:00Z&until=2026-11-01T00:00:00Z${cursor:+&cursor=$cursor}")
  echo "$page" | jq -c '.data[]'
  cursor=$(echo "$page" | jq -r '.next_cursor // empty')
  [ -z "$cursor" ] && break
done

Lo que aún no está

  • Endpoints de escritura. La API es de solo lectura.
  • Tokens de equipo que pertenezcan a un equipo en lugar de a una persona. Hoy, un token personal lee lo que esa persona puede ver, notas de equipo incluidas; los tokens de equipo se sumarán a eso sin cambiarlo.