Skip to content

Endpoints

URL base: https://api.zelta.dev/meet/v1

Todos los endpoints requieren autenticación mediante clave API en el header Authorization. Las respuestas usan formato JSON. Las fechas siguen el formato ISO 8601 con zona horaria.

Salas (Rooms)

Listar salas del workspace

http
GET /rooms

Parámetros de consulta:

ParámetroTipoDescripción
pageintegerNúmero de página (default: 1)
per_pageintegerResultados por página (default: 20, max: 100)

Respuesta exitosa (200):

json
{
  "data": [
    {
      "id": "room_abc123",
      "name": "Daily Standup",
      "slug": "daily-standup",
      "url": "meet.zelta.dev/mi-equipo/daily-standup",
      "auto_recording": true,
      "waiting_room": false,
      "mute_on_entry": true,
      "max_participants": null,
      "created_at": "2026-01-10T08:00:00Z"
    }
  ],
  "meta": {
    "total": 8,
    "page": 1,
    "per_page": 20
  }
}

Crear sala

http
POST /rooms

Cuerpo de la petición:

json
{
  "name": "Sprint Review",
  "slug": "sprint-review",
  "settings": {
    "auto_recording": true,
    "waiting_room": false,
    "mute_on_entry": true,
    "max_participants": 50
  }
}

Respuesta exitosa (201):

json
{
  "data": {
    "id": "room_def456",
    "name": "Sprint Review",
    "slug": "sprint-review",
    "url": "meet.zelta.dev/mi-equipo/sprint-review",
    "auto_recording": true,
    "waiting_room": false,
    "mute_on_entry": true,
    "max_participants": 50,
    "created_at": "2026-03-11T10:00:00Z"
  }
}

Obtener sala

http
GET /rooms/{room_id}

Actualizar configuración de sala

http
PATCH /rooms/{room_id}

Cuerpo de la petición:

json
{
  "settings": {
    "auto_recording": false,
    "waiting_room": true
  }
}

Eliminar sala

http
DELETE /rooms/{room_id}

WARNING

Eliminar una sala es irreversible. Las grabaciones asociadas se conservan, pero el slug queda disponible para reutilización.

Reuniones (Meetings)

Listar reuniones

http
GET /meetings

Parámetros de consulta:

ParámetroTipoDescripción
room_idstringFiltrar por sala
statusstringactive, scheduled, ended
fromdatetimeFecha de inicio del rango (ISO 8601)
todatetimeFecha de fin del rango (ISO 8601)
pageintegerNúmero de página
per_pageintegerResultados por página

Crear reunión programada

http
POST /meetings

Cuerpo de la petición:

json
{
  "title": "Revisión semanal del proyecto",
  "room_id": "room_abc123",
  "scheduled_at": "2026-03-15T10:00:00-05:00",
  "duration_minutes": 60,
  "participants": [
    { "email": "ana@ejemplo.com", "role": "moderator" },
    { "email": "carlos@ejemplo.com", "role": "participant" }
  ],
  "recurrence": {
    "frequency": "weekly",
    "day_of_week": "friday",
    "ends_at": "2026-06-30T23:59:59-05:00"
  }
}

Obtener reunión

http
GET /meetings/{meeting_id}

Actualizar reunión

http
PATCH /meetings/{meeting_id}

Cancelar reunión

http
DELETE /meetings/{meeting_id}

Iniciar reunión en sala

http
POST /rooms/{room_id}/start

Respuesta exitosa (200):

json
{
  "data": {
    "meeting_id": "mtg_xyz789",
    "room_id": "room_abc123",
    "join_url": "meet.zelta.dev/mi-equipo/daily-standup",
    "status": "active",
    "started_at": "2026-03-11T09:00:00Z",
    "recording": true
  }
}

Finalizar reunión

http
POST /meetings/{meeting_id}/end

Grabaciones (Recordings)

Listar grabaciones

http
GET /recordings

Parámetros de consulta:

ParámetroTipoDescripción
room_idstringFiltrar por sala
statusstringrecording, processing, ready, failed
fromdatetimeFecha de inicio del rango
todatetimeFecha de fin del rango
pageintegerNúmero de página
per_pageintegerResultados por página

Respuesta exitosa (200):

json
{
  "data": [
    {
      "id": "rec_abc123",
      "meeting_id": "mtg_xyz789",
      "room_slug": "daily-standup",
      "status": "ready",
      "duration_seconds": 1847,
      "file_size_mb": 245.6,
      "download_url": "https://storage.zelta.dev/recordings/rec_abc123.mp4",
      "transcript_available": true,
      "started_at": "2026-03-11T09:00:00Z",
      "ended_at": "2026-03-11T09:30:47Z"
    }
  ],
  "meta": {
    "total": 42,
    "page": 1,
    "per_page": 20
  }
}

Obtener grabación

http
GET /recordings/{recording_id}

Descargar grabación

http
GET /recordings/{recording_id}/download

Retorna una redirección 302 a la URL de descarga temporal del archivo MP4.

Obtener transcripción

http
GET /recordings/{recording_id}/transcript

Parámetros de consulta:

ParámetroTipoDescripción
formatstringjson (default), txt, srt

Eliminar grabación

http
DELETE /recordings/{recording_id}

Miembros (Members)

Listar miembros del workspace

http
GET /members

Respuesta exitosa (200):

json
{
  "data": [
    {
      "id": "mem_abc123",
      "email": "ana@ejemplo.com",
      "name": "Ana García",
      "role": "admin",
      "status": "active",
      "last_activity_at": "2026-03-11T14:30:00Z",
      "meetings_this_month": 23,
      "joined_at": "2026-01-15T10:00:00Z"
    }
  ],
  "meta": {
    "total": 12,
    "page": 1,
    "per_page": 20
  }
}

Invitar miembro

http
POST /members

Cuerpo de la petición:

json
{
  "email": "nuevo@ejemplo.com",
  "role": "member"
}

Obtener miembro

http
GET /members/{member_id}

Actualizar rol de miembro

http
PATCH /members/{member_id}

Cuerpo de la petición:

json
{
  "role": "admin"
}

Remover miembro

http
DELETE /members/{member_id}

Integraciones

Listar integraciones activas

http
GET /integrations

Respuesta exitosa (200):

json
{
  "data": [
    {
      "id": "int_gc001",
      "type": "google_calendar",
      "status": "connected",
      "connected_at": "2026-02-01T08:00:00Z",
      "calendars": ["Calendario principal", "Equipo de Producto"]
    },
    {
      "id": "int_sl001",
      "type": "slack",
      "status": "connected",
      "connected_at": "2026-02-05T12:00:00Z",
      "channel": "#reuniones"
    }
  ]
}

Desconectar integración

http
DELETE /integrations/{integration_id}

Webhooks

Listar webhooks

http
GET /webhooks

Crear webhook

http
POST /webhooks

Cuerpo de la petición:

json
{
  "url": "https://tu-servidor.com/webhooks/zelta-meet",
  "events": ["meeting.started", "meeting.ended", "recording.ready"],
  "secret": "whsec_tu_secreto"
}

Eliminar webhook

http
DELETE /webhooks/{webhook_id}

Ejemplo completo: Crear sala y programar reunión recurrente

bash
# 1. Crear una sala permanente
curl -X POST https://api.zelta.dev/meet/v1/rooms \
  -H "Authorization: Bearer zm_live_abc123def456" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Sprint Review",
    "slug": "sprint-review",
    "settings": {
      "auto_recording": true,
      "waiting_room": false,
      "mute_on_entry": true
    }
  }'

# 2. Programar reunión recurrente en esa sala
curl -X POST https://api.zelta.dev/meet/v1/meetings \
  -H "Authorization: Bearer zm_live_abc123def456" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Sprint Review Semanal",
    "room_id": "room_def456",
    "scheduled_at": "2026-03-20T15:00:00-05:00",
    "duration_minutes": 45,
    "participants": [
      { "email": "pm@ejemplo.com", "role": "moderator" },
      { "email": "dev1@ejemplo.com", "role": "participant" },
      { "email": "dev2@ejemplo.com", "role": "participant" },
      { "email": "design@ejemplo.com", "role": "participant" }
    ],
    "recurrence": {
      "frequency": "weekly",
      "day_of_week": "friday",
      "ends_at": "2026-12-31T23:59:59-05:00"
    }
  }'

Códigos de error

CódigoSignificado
400Petición malformada o parámetros inválidos
401Clave API inválida o no proporcionada
403Permisos insuficientes para esta operación
404Recurso no encontrado
409Conflicto (ej: slug de sala ya existe)
429Límite de tasa excedido
500Error interno del servidor

Formato de error:

json
{
  "error": "slug_already_exists",
  "message": "Ya existe una sala con el slug 'sprint-review' en este workspace.",
  "status": 409
}

INFO

Todos los endpoints soportan paginación con los parámetros page y per_page. Las fechas usan formato ISO 8601 con zona horaria. Los IDs de recursos usan prefijos descriptivos (room_, mtg_, rec_, mem_).

Documentación oficial de Zelta