Hi @elisa.zoom. Ah, yes it’s a double encoding issue, even though the webinar ID’s do not contain a double slash.
Here are the full steps to reproduce. You will of course need a webinar with a plus sign to try it. The only edits here are removing the token and webinar details.
Fetch list of webinars:
curl --location 'https://api.zoom.us/v2/report/upcoming_events?from=2025-11-01&type=webinar&to=2025-11-30' \
--header 'Authorization: Bearer TOKEN_REMOVED'
Response:
{
"from": "2025-11-03",
"to": "2025-11-30",
"page_size": 30,
"next_page_token": "",
"upcoming_events": [
{
"id": "0LEkvqqIRn+CaF7paPIRgA==",
"topic": "TOPIC_REMOVED",
"dept": "",
"start_time": "2025-11-06T19:00:00Z",
"host_id": "JonaHOmKQxqapDN41l7C2Q",
"host_name": "HOST_REMOVED"
},
{
"id": "uUQqs9o0RimzLY9Ls0HNCA==",
"topic": "TOPIC_REMOVED",
"dept": "",
"start_time": "2025-11-13T00:45:00Z",
"host_id": "LOnXqtAZSzy5eDNGtfqjwg",
"host_name": "HOST_REMOVED"
}
]
}
Then use the webinar ID’s from that list to fetch individual webinar details…
Fetching the second webinar’s details (which does not contain the plus sign):
curl --location 'https://api.zoom.us/v2/webinars/uUQqs9o0RimzLY9Ls0HNCA==' \
--header 'Authorization: Bearer TOKEN_REMOVED'
Response:
{
"uuid": "uUQqs9o0RimzLY9Ls0HNCA==",
"id": 88032493017,
"host_id": "LOnXqtAZSzy5eDNGtfqjwg",
"host_email": "EMAIL_REMOVED",
"topic": "TOPIC_REMOVED",
"type": 5,
"start_time": "2025-11-13T00:45:00Z",
"duration": 105,
...etc
}
Fetching the first webinar’s details (which does contain a plus sign) the exact same way:
curl --location 'https://api.zoom.us/v2/webinars/0LEkvqqIRn+CaF7paPIRgA==' \
--header 'Authorization: Bearer TOKEN_REMOVED'
{
"code": 3001,
"message": "Meeting is not found or has expired."
}
With single encoding:
curl --location 'https://api.zoom.us/v2/webinars/0LEkvqqIRn%2BCaF7paPIRgA==' \
--header 'Authorization: Bearer TOKEN_REMOVED'
{
"code": 3001,
"message": "Meeting is not found or has expired."
}
With double encoding:
curl --location 'https://api.zoom.us/v2/webinars/0LEkvqqIRn%252BCaF7paPIRgA==' \
--header 'Authorization: Bearer TOKEN_REMOVED'
{
"uuid": "0LEkvqqIRn+CaF7paPIRgA==",
"id": 87172505602,
"host_id": "JonaHOmKQxqapDN41l7C2Q",
"host_email": "EMAIL_REMOVED",
"topic": "TOPIC_REMOVED",
"type": 5,
"start_time": "2025-11-06T19:00:00Z",
"duration": 60,
...etc
}
So, I think the solution here is actually just documentation. The webinar details endpoint documentation doesn’t indicate anywhere that the ID returned might include characters that make it unsafe to simply take and reuse directly in future API calls, and imho it’s fairly reasonable to assume an ID would be safe to reuse. So we only encountered this as a bug once already in production. Double encoding before using that ID in any further API requests is easy enough, and I’ll implement that now, I just didn’t realise it would be necessary.
Thanks.