ClonifyDevelopersIr al panel

Empezar

  • Autenticación
  • Errores
  • Paginación
  • Límites de peticiones
  • Webhooks
  • Para agentes de IA
  • Servidor MCP

Referencia de la API

  • Seguimiento de alumnos6
  • Entregas externas por API6
  • Chat con el clon1
  • Contactos y etiquetas5
  • Accesos de academias4
  • Conversaciones4
  • Catálogo de productos11
  • Ventas externas2
  • Conocimiento12
  • Multimedia4
  • Clones (versions en la API)3
  • Reuniones y reservas3
  • Webinars6
  • Cuenta y consumo1
Clonify

Seguimiento de alumnos

GET/api/v1/products/{id}/students

Listar los alumnos de un curso y cómo van

Quién tiene acceso al curso y en qué estado está cada uno: activo (alguna señal de estudio en los últimos 7 días), en riesgo (7 a 13 días sin actividad), parado (14 o más), sin empezar (sin ninguna actividad) o terminado (todas las clases publicadas marcadas). Cuenta como actividad marcar una clase, abrirla, ver su vídeo, asistir a un directo del curso o ver su grabación. Incluye la última actividad con su clase o directo, las clases marcadas y las empezadas sin marcar, el acceso y un resumen del curso entero. Son los mismos datos que la pestaña Alumnos del panel.

Parámetros de consulta

statusactive | at_risk | stalled | not_started | completed | attention

Solo los de un estado; attention = los que necesitan un empujón (en riesgo, parados de menos de 90 días y sin empezar con acceso desde hace 7 a 29 días).

sortattention | recent | oldest | progress | progress-asc | activity | activity-asc

Orden. attention (por defecto) pone primero a quien necesita un empujón; recent/oldest, por fecha de alta; progress, por clases marcadas; activity, por última actividad.

emailstring

Busca por correo o nombre dentro del curso.

starting_afterstring

Cursor recibido en next_starting_after. Omitir en la primera página.

limitinteger 1..200

Máximo de alumnos por página: 1–200; predeterminado 50.

bash
curl "https://www.clonify.com/api/v1/products/1/students" \
  -H "Authorization: Bearer clk_live_…"
json
{
  "object": "list",
  "data": [
    {
      "object": "course_student",
      "visitor_id": 88,
      "contact_id": 135,
      "email": "student@example.test",
      "name": "Student",
      "status": "active",
      "status_days": 1,
      "needs_attention": false,
      "last_activity_at": "2026-10-13T21:36:00Z",
      "last_activity": {
        "kind": "video",
        "at": "2026-10-13T21:36:00Z",
        "lesson_id": 1004,
        "lesson_title": "Lesson 4",
        "live_id": null,
        "live_title": null
      },
      "last_marked_at": "2026-09-22T10:00:00Z",
      "completed_lessons": 3,
      "total_lessons": 12,
      "completed_lesson_ids": [
        1001,
        1002,
        1003
      ],
      "started_lesson_ids": [
        1004
      ],
      "access": {
        "source": "purchase",
        "by_tag": true,
        "included_from_product_ids": [],
        "granted_at": "2026-08-30T10:00:00Z",
        "expires_at": null,
        "paused": false
      }
    }
  ],
  "has_more": true,
  "next_starting_after": "bzo1MA",
  "summary": {
    "total": 14,
    "matching": 14,
    "by_status": {
      "active": 5,
      "at_risk": 3,
      "stalled": 3,
      "not_started": 2,
      "completed": 1
    },
    "needs_attention": 7,
    "at_risk_after_days": 7,
    "stalled_after_days": 14
  },
  "measurement": {
    "activity": "Any study signal in this course: completing a lesson, opening it, watching its video, attending one of the course's live sessions or watching its recording.",
    "coverage": "Lesson opens and video watching are recorded since 2026-09-24 and only for campus and Bunny players (not YouTube, Vimeo or other sites); earlier, only completed lessons exist.",
    "paging": "Pages follow the requested order at request time; if students change between calls a page may repeat or skip someone. Re-read all pages to refresh."
  }
}
GET/api/v1/learning/playback

Consultar reproducción de vídeos

Muestras nuevas de los reproductores observables de clases, emisiones y repeticiones (Bunny y Mux). Requiere exactamente product_id para clases o webinar_id para directos/repeticiones. Cada fila contiene incrementos, no totales: visible_playing_seconds estima reproducción con pestaña visible y media_seconds avance reproducido, ajustado por velocidad cuando está disponible. Las repeticiones vuelven a sumar; no es porcentaje único visto. Saltar de posición no acredita el tramo saltado. pause_count cuenta pausas y seek_count saltos/discontinuidades observadas; position_seconds es una posición, no tiempo visto. Campos enviados por el navegador y limitados con reloj del servidor; no prueban atención ni impiden toda falsificación. visitor_id identifica sesión verificada; registrant_id sin visitante corresponde a enlace de inscripción, que puede reenviarse. No se unifican automáticamente ambos tipos de identidad. Se excluyen pausas, pestañas ocultas y huecos largos; puede faltar el final al cerrar o perder conexión. Los iframes sin velocidad verificable se miden conservadoramente a 1x y pueden infracontar o marcar discontinuidades a otras velocidades. No incluye audio ni otros proveedores externos sin adaptador. Los permisos de envío duran hasta 12 horas desde el acceso autorizado y no conceden acceso al vídeo. resource identifica el contenido observado. No reconstruye históricos, no cambia completados y no certifica FUNDAE. El cursor sirve para nuevas muestras; sin filtros de fecha o alumno, filtra esos campos en el cliente.

Parámetros de consulta

product_idinteger

Curso. Indicar este parámetro o webinar_id, nunca ambos.

webinar_idinteger

Directo cuya emisión o repetición se consulta. Nunca se atribuye automáticamente a un curso.

starting_afterinteger

ID de la última muestra recibida para continuar la exportación.

limitinteger 1..200

Máximo de muestras: 1–200; predeterminado 100.

bash
curl "https://www.clonify.com/api/v1/learning/playback" \
  -H "Authorization: Bearer clk_live_…"
json
{
  "object": "list",
  "data": [
    {
      "id": "1",
      "session_id": "6e2c91cc-15a5-4c46-a5cd-1db7703c1d20",
      "visitor_id": 88,
      "registrant_id": null,
      "kind": "course",
      "product_id": 100,
      "unit_id": 1000,
      "block_id": 1001,
      "webinar_id": null,
      "resource": "content-fingerprint",
      "occurred_at": "2026-09-24T12:00:30Z",
      "visible_playing_seconds": 30,
      "media_seconds": 60,
      "position_seconds": 90,
      "pause_count": 0,
      "seek_count": 1,
      "closed": false
    }
  ],
  "has_more": false,
  "next_starting_after": null,
  "measurement": {
    "source": "visible_player_client_reported",
    "limits": "Not proof of attention. Media seconds include repeats, not unique coverage. Missing telemetry is not reconstructed. Server caps concurrent time per known visitor or registration."
  }
}
GET/api/v1/learning/attendance

Consultar conexiones a mesas de grupo

Evidencias nuevas desde la activación, confirmadas por avisos firmados de LiveKit. Una fila por inscripción con las conexiones a la sala principal y sus salas de grupo. confirmed_connected_seconds suma intervalos completos sin duplicar solapamientos entre dispositivos o salas de una misma inscripción. entry_only y exit_only indican límites desconocidos y no suman duración; closed tiene entrada y salida observadas. No incluye emisiones, visitas a la página ni espera en la puerta. identity_source es registration_link o verified_session; visitor_id solo se vincula con sesión verificada del mismo correo y academia. Un enlace reenviado no demuestra quién está detrás. audience_product_ids conserva el público configurado, no acredita matrícula ni asigna minutos a cursos. No demuestra atención ni cumplimiento FUNDAE. No reconstruye históricos ni garantiza conservación documental. No admite filtros de fecha o product_id: para la asistencia de todas las sesiones de un curso entre dos fechas, con estos segundos ya sumados, usa GET /api/v1/webinars/attendance. Vuelve a consultar todas las páginas para actualizar conexiones, el cursor no ordena cambios.

Parámetros de consulta

webinar_idintegerobligatorio

Identificador de la mesa de grupo. Obligatorio.

visitor_idinteger

Filtra inscripciones vinculadas a este alumno verificado o sus identidades del mismo correo en la academia. Cada conexión conserva su propia fuente de identidad.

starting_afterinteger

ID de inscripción recibido en next_starting_after. Omitir en la primera página.

limitinteger 1..100

Máximo de inscripciones: 1–100; predeterminado 50.

bash
curl "https://www.clonify.com/api/v1/learning/attendance" \
  -H "Authorization: Bearer clk_live_…"
json
{
  "object": "list",
  "data": [
    {
      "id": "10",
      "registrant_id": 10,
      "registrant_email": "student@example.test",
      "registrant_name": "Student",
      "webinar_id": 50,
      "confirmed_connected_seconds": 120,
      "has_incomplete_connections": false,
      "connections": [
        {
          "room_name": "webinar-example1",
          "room_sid": "RM_example",
          "participant_sid": "PA_example",
          "visitor_id": 88,
          "identity_source": "verified_session",
          "audience_product_ids": [
            100
          ],
          "joined_at": "2026-09-24T12:00:00Z",
          "left_at": "2026-09-24T12:02:00Z",
          "connected_seconds": 120,
          "join_event_id": "event-join",
          "leave_event_id": "event-leave",
          "status": "closed"
        }
      ]
    }
  ],
  "has_more": false,
  "next_starting_after": null,
  "measurement": {
    "source": "signed_livekit_webhooks",
    "scope": "group_sessions_only",
    "duration": "union of observed closed intervals per registration; incomplete intervals excluded",
    "limitations": "connection evidence, not attention or learning; forwarded links cannot prove the human identity",
    "refresh": "re-read all pages for the webinar; registrant IDs are not a changes cursor"
  }
}
GET/api/v1/learning/events

Consultar evidencias de aprendizaje

Historial nuevo desde la activación: lesson_opened, lesson_completed, lesson_uncompleted, quiz_submitted y assignment_submitted. También exam_started, exam_submitted y exam_reviewed para exámenes independientes: entrega y revisiones conservan preguntas, respuestas y notas; review_status distingue notas pendientes de revisión. certificate_issued conserva cada emisión y sus requisitos comprobados; certificate_pdf_generated identifica el PDF generado con SHA-256, sin confirmar recepción. Los exámenes se consultan por su propio product_id, no se asignan automáticamente a un curso. No reconstruye actividad anterior, no conserva los archivos por sí mismo ni certifica cumplimiento FUNDAE. En cuestionarios, source distingue server_graded de legacy_client_reported.

Parámetros de consulta

product_idintegerobligatorio

Curso o ficha interna del examen que se consulta. Obligatorio; los exámenes independientes usan su propio identificador.

visitor_idinteger

Alumno; incluye identidades con el mismo correo dentro de la academia.

starting_afterinteger

ID de paginación recibido en next_starting_after. Omitir en la primera página.

limitinteger 1..200

Máximo de registros: 1–200; predeterminado 100.

fromISO 8601

Fecha inclusiva con zona horaria. En sesiones filtra la fecha de inicio; no recorta sus segundos.

untilISO 8601

Fecha exclusiva con zona horaria. En sesiones filtra la fecha de inicio; no recorta sus segundos.

bash
curl "https://www.clonify.com/api/v1/learning/events" \
  -H "Authorization: Bearer clk_live_…"
json
{
  "object": "list",
  "data": [
    {
      "id": "1",
      "visitor_id": 88,
      "visitor_email": "student@example.test",
      "product_id": 100,
      "unit_id": null,
      "block_id": null,
      "kind": "certificate_pdf_generated",
      "occurred_at": "2026-09-24T12:00:00Z",
      "evidence": {
        "source": "pdf_server",
        "verification_code": "example-code",
        "issued_at": "2026-09-24T11:00:00Z",
        "sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
        "bytes": 24000,
        "receipt_confirmed": false
      }
    }
  ],
  "has_more": false,
  "next_starting_after": null
}
GET/api/v1/learning/sessions

Consultar sesiones de clase

Tiempo estimado con la clase visible y tiempo activo con foco e interacción reciente. No equivale a vídeo reproducido ni acredita aprendizaje. No acumula pestañas ocultas y limita la suma entre dispositivos. Estados open, closed y timed_out. Las filas pueden actualizarse: vuelve a consultar el periodo completo para refrescar sesiones; el cursor ordena creaciones, no cambios.

Parámetros de consulta

product_idintegerobligatorio

Curso que se consulta. Obligatorio.

visitor_idinteger

Alumno; incluye identidades con el mismo correo dentro de la academia.

starting_afterinteger

ID de paginación recibido en next_starting_after. Omitir en la primera página.

limitinteger 1..200

Máximo de registros: 1–200; predeterminado 100.

fromISO 8601

Fecha inclusiva con zona horaria. En sesiones filtra la fecha de inicio; no recorta sus segundos.

untilISO 8601

Fecha exclusiva con zona horaria. En sesiones filtra la fecha de inicio; no recorta sus segundos.

bash
curl "https://www.clonify.com/api/v1/learning/sessions" \
  -H "Authorization: Bearer clk_live_…"
json
{
  "object": "list",
  "data": [
    {
      "id": "1",
      "session_id": "6e2c91cc-15a5-4c46-a5cd-1db7703c1d20",
      "visitor_id": 88,
      "visitor_email": "student@example.test",
      "product_id": 100,
      "unit_id": 1000,
      "started_at": "2026-09-23T12:00:00Z",
      "last_seen_at": "2026-09-23T12:01:00Z",
      "ended_at": null,
      "connected_seconds": 60,
      "active_seconds": 30,
      "status": "open"
    }
  ],
  "has_more": false,
  "next_starting_after": null,
  "measurement": {
    "active_seconds": "visible activity estimate; not video watch time or proof of learning",
    "collection_started": "deployment; no historical reconstruction"
  }
}
GET/api/v1/products/{id}/feedback/responses

Listar respuestas de feedback de un curso

Las respuestas de los alumnos a las encuestas de feedback del curso: la de «En todas las clases» (survey course) y las propias de una clase (survey lesson). Son las mismas filas que el CSV de la pestaña Feedback. Van de la última respuesta a la más antigua. Cada una trae el id del alumno (visitor_id, y contact_id si tiene ficha en Contactos), de la clase, del módulo, de la encuesta y de cada pregunta. Si el alumno cambia su respuesta, cambia esa misma fila (mismo id, nuevo updated_at). No se devuelven respuestas a preguntas que ya no están en la encuesta. Una respuesta que cambie mientras recorres las páginas sube arriba: si aún no te había llegado, esa pasada no la trae, y si era la del cursor, se repiten respuestas. Al terminar, vuelve a pedir con since igual al updated_at más reciente que recibiste para recoger esos cambios, y deduplica por id. 404 si el producto no es un curso de tu cuenta.

Parámetros de ruta

idintegerobligatorio

Id del curso.

Parámetros de consulta

sinceISO 8601

Solo respuestas cambiadas después de esta fecha (excluida), con zona horaria. Para traer solo lo nuevo, usa la fecha de la sincronización anterior.

untilISO 8601

Solo respuestas cambiadas hasta esta fecha (incluida), con zona horaria.

starting_afterinteger

Id recibido en next_starting_after. Omitir en la primera página. Un id que no sea de este curso devuelve 400.

limitinteger 1..200

Respuestas por página: 1–200; predeterminado 50.

bash
curl "https://www.clonify.com/api/v1/products/1/feedback/responses" \
  -H "Authorization: Bearer clk_live_…"
json
{
  "object": "list",
  "data": [
    {
      "object": "feedback_response",
      "id": 31,
      "product_id": 420,
      "survey": "course",
      "common_block_id": 19,
      "block_id": null,
      "unit_id": 71,
      "unit_title": "Lesson 1",
      "module_id": 10,
      "module_title": "Module A",
      "visitor_id": 88,
      "contact_id": 3,
      "visitor_email": "student@example.test",
      "visitor_name": "Student",
      "created_at": "2026-09-27T08:00:00.000Z",
      "updated_at": "2026-09-28T09:00:00.000Z",
      "answers": [
        {
          "question_id": "4b6f0d0e-5d1a-4f0e-9a52-2f3c1e7d9a10",
          "question": "How was this lesson?",
          "kind": "stars",
          "value": 5
        },
        {
          "question_id": "9c1d2e3f-0a4b-4c5d-8e6f-7a8b9c0d1e2f",
          "question": "What would you improve?",
          "kind": "text",
          "value": "More examples"
        }
      ]
    }
  ],
  "has_more": true,
  "next_starting_after": 31
}