Book a session from the record that needs it. This function creates a Zoho Meeting from a Creator record and stores both the participant join link and the host start link back on the row, so the meeting lives alongside the work it belongs to.
Do not use the original. It handled credentials dangerously. The 2020 version obtained an authtoken by sending the host’s email address and password as query-string parameters to accounts.zoho.com/apiauthtoken/nb/create, then storing that password in a Creator form. Passwords in URLs end up in server logs and browser history, and keeping them in an app table means anyone with report access has them. Separately, the whole mechanism is dead: Zoho retired legacy authtokens in December 2020 and every existing token stopped working on 1 April 2021. The original also called /api/private/json/meetings/createMeeting — a private endpoint that was never supported for third-party use. This is a ground-up rewrite on OAuth and the documented v2 API.
zoho_meeting_connection with ZohoMeeting.meeting.CREATE and ZohoMeeting.manageOrg.READ.X-ZSOURCE header.// ============================================
// CREATE A ZOHO MEETING FROM ZOHO CREATOR
// Auth: Zoho OAuth connection. No passwords anywhere.
// ============================================
void Meeting.createSession(int recordId)
{
CONN = "zoho_meeting_connection";
ZSOURCE = "YOUR_COMPANY_NAME"; // mandatory X-ZSOURCE header value
BASE = "https://meeting.zoho.com/api/v2";
rec = Actividades[ID == recordId];
headerMap = Map();
headerMap.put("Content-Type","application/json;charset=UTF-8");
headerMap.put("X-ZSOURCE",ZSOURCE);
// --- 1. Resolve your org id (zsoid). Cache it; it never changes. ---
userResp = invokeurl
[
url : BASE + "/user.json"
type : GET
headers : headerMap
connection : CONN
];
zsoid = userResp.getJSON("userDetails").getJSON("zsoid");
presenterId = userResp.getJSON("userDetails").getJSON("zuid");
if(zsoid == null)
{
info "Could not resolve Zoho Meeting org: " + userResp.toString();
return;
}
// --- 2. Build the session. Mind the date format. ---
session = Map();
session.put("topic",rec.Titulo);
session.put("presenter",presenterId);
session.put("startTime",rec.Fecha_Inicio.toString("MMM d, yyyy hh:mm a"));
session.put("duration",60);
session.put("timezone","America/Mexico_City");
payload = Map();
payload.put("session",session);
// --- 3. Create it ---
response = invokeurl
[
url : BASE + "/" + zsoid + "/sessions.json"
type : POST
parameters : payload.toString()
headers: headerMap
connection : CONN
];
meetingKey = response.getJSON("session").getJSON("meetingKey");
if(meetingKey != null)
{
rec.Zoho_Meeting_Link = "https://meeting.zoho.com/meeting/join?key=" + meetingKey;
rec.Zoho_Meeting_Start_Link = response.getJSON("session").getJSON("startUrl");
info "Meeting created: " + meetingKey;
}
else
{
info "Zoho Meeting error: " + response.toString();
}
}
MMM d, yyyy hh:mm a — Aug 2, 2026 07:00 PM. Not ISO 8601. Send yyyy-MM-dd HH:mm:ss and it fails in a way that does not tell you the format is wrong.X-ZSOURCE is mandatory. Leave the header off and the call is rejected. It is easy to miss because most Zoho APIs do not need it.presenter is a numeric Zoho user ID, not an email address. The /user.json call above returns it as zuid.zsoid. It is stable for your organisation, so store it in a settings form rather than looking it up before every meeting.zohoapis.com. It lives on meeting.zoho.com, with per-datacentre variants including meeting.zohocloud.ca for Canada. There is no native Deluge task — invokeurl is the only route.This script is part of the free Creator Scripts Deluge Library.
All 39 Deluge scripts, the full Zoho Creator course, and every downloadable asset are now free. Get free access →