Documentación
EnglishReferencia 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
- 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.
- 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 devuelve405. - Toda respuesta correcta envuelve su contenido en
data. Las listas añadenhas_moreynext_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:
- Pide la primera página, opcionalmente con
limit(1–200, por defecto 50). - Si
has_moreestrue, pide la página siguiente concursorigual alnext_cursorque recibiste. - Para cuando
has_moreseafalseynext_cursorseanull.
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ámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
limit | integer | 50 | De 1 a 200. |
cursor | string | — | next_cursor de la página anterior. |
since | timestamp | — | Solo reuniones creadas en este instante o después. |
until | timestamp | — | 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ámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
include | string | — | 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ámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
limit | integer | 50 | De 1 a 200. |
cursor | string | — | next_cursor de la página anterior. |
status | string | — | Separados por comas: todo, in_progress, done. |
assignee_human_id | string | — | Solo los asignados a esta persona. |
meeting_id | string | — | 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ámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
limit | integer | 50 | De 1 a 200. |
cursor | string | — | next_cursor de la página anterior. |
q | string | — | 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ámetro | Tipo | Por defecto | Notas |
|---|---|---|---|
limit | integer | 50 | De 1 a 200. |
status | string | — | 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
}
}
| Estado | code | Significado |
|---|---|---|
400 | invalid_request | Un parámetro no es válido. param lo indica. |
401 | unauthorized | No hay token, no es un token mico_pat_ o es un token desconocido. |
401 | token_revoked | El token se revocó. Crea uno nuevo. |
402 | feature_not_included | Tu plan no incluye la API. |
402 | no_plan | Tu cuenta no tiene un plan activo. |
402 | quota_exhausted | Se agotaron las peticiones de este periodo de facturación. resets_at indica cuándo se renuevan. |
404 | not_found | No existe ese endpoint. |
404 | meeting_not_found | No hay ninguna reunión con ese ID en tu cuenta. |
404 | shared_note_not_found | No hay ninguna nota con ese ID compartida contigo. |
404 | team_not_found | No eres miembro de ese equipo. |
402 | team_plan_required | El plan del equipo no incluye los accionables de equipo. |
405 | method_not_allowed | La API solo acepta GET. |
429 | rate_limited | Demasiadas peticiones en el último minuto. Espera los segundos que indique Retry-After. |
500 | internal_error | Algo falló en el lado de Mico. request_id identifica la petición. |
503 | unavailable | Mico 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ímite | Flow | Enterprise |
|---|---|---|
| Peticiones por periodo de facturación | 50.000 | 50.000, o lo que diga tu contrato |
| Peticiones por minuto | 120 | 120 |
Las respuestas correctas informan de la cuota del periodo de facturación en cabeceras:
| Cabecera | Contenido |
|---|---|
X-Quota-Limit | Peticiones incluidas en este periodo de facturación. |
X-Quota-Remaining | Peticiones restantes en este periodo de facturación. |
X-Quota-Reset | Cuá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.