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
GET /roomsParámetros de consulta:
| Parámetro | Tipo | Descripción |
|---|---|---|
page | integer | Número de página (default: 1) |
per_page | integer | Resultados por página (default: 20, max: 100) |
Respuesta exitosa (200):
{
"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
POST /roomsCuerpo de la petición:
{
"name": "Sprint Review",
"slug": "sprint-review",
"settings": {
"auto_recording": true,
"waiting_room": false,
"mute_on_entry": true,
"max_participants": 50
}
}Respuesta exitosa (201):
{
"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
GET /rooms/{room_id}Actualizar configuración de sala
PATCH /rooms/{room_id}Cuerpo de la petición:
{
"settings": {
"auto_recording": false,
"waiting_room": true
}
}Eliminar sala
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
GET /meetingsParámetros de consulta:
| Parámetro | Tipo | Descripción |
|---|---|---|
room_id | string | Filtrar por sala |
status | string | active, scheduled, ended |
from | datetime | Fecha de inicio del rango (ISO 8601) |
to | datetime | Fecha de fin del rango (ISO 8601) |
page | integer | Número de página |
per_page | integer | Resultados por página |
Crear reunión programada
POST /meetingsCuerpo de la petición:
{
"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
GET /meetings/{meeting_id}Actualizar reunión
PATCH /meetings/{meeting_id}Cancelar reunión
DELETE /meetings/{meeting_id}Iniciar reunión en sala
POST /rooms/{room_id}/startRespuesta exitosa (200):
{
"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
POST /meetings/{meeting_id}/endGrabaciones (Recordings)
Listar grabaciones
GET /recordingsParámetros de consulta:
| Parámetro | Tipo | Descripción |
|---|---|---|
room_id | string | Filtrar por sala |
status | string | recording, processing, ready, failed |
from | datetime | Fecha de inicio del rango |
to | datetime | Fecha de fin del rango |
page | integer | Número de página |
per_page | integer | Resultados por página |
Respuesta exitosa (200):
{
"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
GET /recordings/{recording_id}Descargar grabación
GET /recordings/{recording_id}/downloadRetorna una redirección 302 a la URL de descarga temporal del archivo MP4.
Obtener transcripción
GET /recordings/{recording_id}/transcriptParámetros de consulta:
| Parámetro | Tipo | Descripción |
|---|---|---|
format | string | json (default), txt, srt |
Eliminar grabación
DELETE /recordings/{recording_id}Miembros (Members)
Listar miembros del workspace
GET /membersRespuesta exitosa (200):
{
"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
POST /membersCuerpo de la petición:
{
"email": "nuevo@ejemplo.com",
"role": "member"
}Obtener miembro
GET /members/{member_id}Actualizar rol de miembro
PATCH /members/{member_id}Cuerpo de la petición:
{
"role": "admin"
}Remover miembro
DELETE /members/{member_id}Integraciones
Listar integraciones activas
GET /integrationsRespuesta exitosa (200):
{
"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
DELETE /integrations/{integration_id}Webhooks
Listar webhooks
GET /webhooksCrear webhook
POST /webhooksCuerpo de la petición:
{
"url": "https://tu-servidor.com/webhooks/zelta-meet",
"events": ["meeting.started", "meeting.ended", "recording.ready"],
"secret": "whsec_tu_secreto"
}Eliminar webhook
DELETE /webhooks/{webhook_id}Ejemplo completo: Crear sala y programar reunión recurrente
# 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ódigo | Significado |
|---|---|
400 | Petición malformada o parámetros inválidos |
401 | Clave API inválida o no proporcionada |
403 | Permisos insuficientes para esta operación |
404 | Recurso no encontrado |
409 | Conflicto (ej: slug de sala ya existe) |
429 | Límite de tasa excedido |
500 | Error interno del servidor |
Formato de error:
{
"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_).