ClonifyDevelopersOpen panel

Getting started

  • Authentication
  • Errors
  • Pagination
  • Rate limits
  • Webhooks
  • For AI agents
  • MCP server

API reference

  • Student learning activity6
  • External API deliveries6
  • Chat with the clone1
  • Contacts & tags5
  • Academy access4
  • Conversations4
  • Product catalogue11
  • External sales2
  • Knowledge12
  • Multimedia4
  • Clones (versions in the API)3
  • Meetings & bookings3
  • Webinars6
  • Account & usage1
Clonify

Webinars

GET/api/v1/webinars

List webinars

Your webinars with their registrant count. Upcoming ones by default; with scope=past, the ones already held (most recent first). You can keep only the sessions of one course or product and those starting between two dates. Without those parameters it responds exactly as before. Streaming credentials never travel.

Plan with the Webinars section

Query parameters

scopestring

upcoming (default): sessions that have not finished yet, in chronological order. past: finished or cancelled sessions, most recent first. all: every session, in chronological order.Values: upcoming · past · all

product_idinteger

Only sessions whose audience includes this product, whether it is their main product or an additional one.

fromISO 8601

Only sessions starting at or after this date. ISO 8601 with a time zone (2026-10-01T00:00:00Z) or a day (2026-10-01, UTC midnight).

untilISO 8601

Only sessions starting before this date (exclusive). Same format as from.

starting_afterinteger

The next_starting_after of the previous page. Keep requesting while has_more is true; omit it on the first page.

limitinteger 1..200
bash
curl "https://www.clonify.com/api/v1/webinars" \
  -H "Authorization: Bearer clk_live_…"
json
{
  "object": "list",
  "data": [{
    "object": "webinar",
    "id": 410,
    "title": "Clase en directo: módulo 3",
    "start_at": "2026-10-07T16:00:00.000Z",
    "duration_minutes": 90,
    "status": "ended",
    "audience_product_id": 3161,
    "audience_product_ids": [3161],
    "replay_published": true,
    "registrant_count": 48
  }],
  "has_more": true,
  "next_starting_after": 410
}
POST/api/v1/webinars

webinars_create

Write permissionPlan with the Webinars section

Body (JSON)

titlestring (máx 200)required
start_atISO 8601 (futuro)required
descriptionstring (máx 2000)
duration_minutesinteger 1..600 (45 por defecto)
timezonezona IANA (Europe/Madrid por defecto)
capacityinteger | null
audience_product_idsinteger[]
session_kindstring

Values: broadcast · group

broadcast_sourcestring

Values: clonify · external

recurrencestring

Values: once · weekly

recurrence_end{ type: forever | until | count, until_at?, count? }
auto_publish_replayboolean
bash
curl -X POST "https://www.clonify.com/api/v1/webinars" \
  -H "Authorization: Bearer clk_live_…" \
  -H "Content-Type: application/json" \
  -d '{"title":"…","start_at":"…"}'
json
{
  "object": "list",
  "data": [{
    "object": "webinar",
    "id": 433,
    "title": "Asset allocation",
    "start_at": "2026-10-14T16:00:00.000Z",
    "duration_minutes": 120,
    "timezone": "Europe/Madrid",
    "status": "scheduled",
    "audience_product_ids": [3161],
    "session_kind": "group",
    "broadcast_source": "clonify",
    "public_slug": "42e59b8bdc0d",
    "replay_published": false,
    "auto_publish_replay": true,
    "registrant_count": 0
  }],
  "has_more": false,
  "next_starting_after": null,
  "calendar_activated": false
}
GET/api/v1/webinars/{id}

webinars_get

Plan with the Webinars section

Path parameters

idintegerrequired
bash
curl "https://www.clonify.com/api/v1/webinars/1" \
  -H "Authorization: Bearer clk_live_…"
PATCH/api/v1/webinars/{id}

webinars_update

Write permissionPlan with the Webinars section

Path parameters

idintegerrequired

Body (JSON)

titlestring (máx 200)
descriptionstring | null
start_atISO 8601
duration_minutesinteger 1..600
capacityinteger | null
audience_product_idsinteger[]
session_kindstring

Values: broadcast · group

broadcast_sourcestring

Values: clonify · external

auto_publish_replayboolean
bash
curl -X PATCH "https://www.clonify.com/api/v1/webinars/1" \
  -H "Authorization: Bearer clk_live_…" \
  -H "Content-Type: application/json" \
  -d '{"title":"…","description":"…"}'
GET/api/v1/webinars/{id}/registrants

List a webinar's registrants

Name, email and status (registered / attended / no-show) of each registrant. Their room access token never travels.

Plan with the Webinars section

Path parameters

idintegerrequired
bash
curl "https://www.clonify.com/api/v1/webinars/1/registrants" \
  -H "Authorization: Bearer clk_live_…"
GET/api/v1/webinars/attendance

Export attendance for a course's live sessions

One row per session and person for every session of a course or product that has already started (cancelled sessions are left out), so you don't have to request registrants one session at a time. status is attended when the person is recorded as having reached the live session (played the broadcast or reached the group room door); registered_not_attended when they have a registration but no recorded entry; no_show when they registered for a public session and were marked absent once it ended. In the 24 hours before a course session, Clonify registers the people with access to its products (up to 500 per product, and nobody when the product is open to anyone), so registered_not_attended usually means "invited, did not come"; people beyond that cap have no registration. In a session shared by several products you only get the students of the requested product_id: people whose access at the session start came only from the other products are left out, and people with no recorded access at all are kept. With include_not_joined=true you also get not_joined rows: people who had access to the product when the session started and have no registration. That status is DERIVED from the access records that exist today (a purchase or access tag from when it was recorded in Clonify, a bundle inclusion from when it opened) and their expiry; it is not a record of anything the person did, it does not recover access removed or refunded later and, for products open to anyone, it only covers people with a recorded access. status_source tells where each row comes from (registration or access). live_seconds measures confirmed group room connection time or visible broadcast playback time, and replay_watched_seconds the replay watched; both are null when there is no measurement, which started in September 2026 and is not reconstructed backwards. They are connection and playback data, not proof of attention. A page can hold fewer rows than limit, or none, while has_more is still true: keep requesting until it is false. Every response includes a measurement object summarising what each field measures.

Plan with the Webinars section

Query parameters

product_idintegerrequired

The course or product. You get the sessions whose audience includes it, and not_joined rows are computed from access to this product. Required.

fromISO 8601

Only sessions starting at or after this date. ISO 8601 with a time zone (2026-10-01T00:00:00Z) or a day (2026-10-01, UTC midnight).

untilISO 8601

Only sessions starting before this date (exclusive). Same format as from.

webinar_idinteger

Limits the export to a single session of the product.

include_not_joinedboolean

true adds people who had access to the product when the session started and have no registration (status not_joined, derived from access). Default false: registrations only.

starting_afterstring

The next_starting_after of the previous page, unchanged (it is an opaque cursor). Omit it on the first page.

limitinteger 1..200

Maximum rows per page: 1–200; default 100.

bash
curl "https://www.clonify.com/api/v1/webinars/attendance" \
  -H "Authorization: Bearer clk_live_…"
json
{
  "object": "list",
  "data": [{
    "object": "webinar_attendance",
    "id": "WzQxMCwiYW5hQGV4YW1wbGUuY29tIl0",
    "webinar_id": 410,
    "webinar_title": "Clase en directo: módulo 3",
    "webinar_start_at": "2026-10-07T16:00:00.000Z",
    "webinar_status": "ended",
    "session_kind": "group",
    "registrant_id": 9120,
    "contact_id": 3,
    "visitor_id": 88,
    "name": "Ana Pérez",
    "email": "ana@example.com",
    "status": "attended",
    "status_source": "registration",
    "registered_at": "2026-10-06T16:00:04.000Z",
    "live_seconds": 4980,
    "live_seconds_source": "group_room_connections",
    "replay_watched": false,
    "replay_watched_seconds": null
  }, {
    "object": "webinar_attendance",
    "id": "WzQxMCwibHVpc0BleGFtcGxlLmNvbSJd",
    "webinar_id": 410,
    "webinar_title": "Clase en directo: módulo 3",
    "webinar_start_at": "2026-10-07T16:00:00.000Z",
    "webinar_status": "ended",
    "session_kind": "group",
    "registrant_id": null,
    "contact_id": 41,
    "visitor_id": 97,
    "name": "Luis Gómez",
    "email": "luis@example.com",
    "status": "not_joined",
    "status_source": "access",
    "registered_at": null,
    "live_seconds": null,
    "live_seconds_source": null,
    "replay_watched": true,
    "replay_watched_seconds": 1830
  }],
  "has_more": true,
  "next_starting_after": "WzQxMCwibHVpc0BleGFtcGxlLmNvbSJd",
  "measurement": { "status": "…", "not_joined": "…", "live_seconds": "…" }
}