As a meeting host, you can add closed captions to Zoom meetings by providing a captioner with a Caption URL. The Caption URL allows captioners to stream the text from their closed captioning software to the Zoom meeting. In order to establish the connection, captioners must input the Caption URL into a closed captioning software that supports Zoom's Closed Captioning REST API. To acquire the Caption URL, captioners may join a Zoom meeting, gain captioning privileges from the host, and copy the Caption URL by activating the “Use a 3rd Party CC service” button. Alternatively, meeting hosts may copy the URL and send it to the captioner via in-meeting chat, or any other form of text communication.
The documentation below defines the format used by Zoom to receive Closed Caption data.
- Using URLs Provided by Zoom for Closed Captions over HTTP
- Content Type
- Content Data
- Response Codes
- Request Retries
- HTTP POST returns Timestamp
- Example Post
Using URLs Provided by Zoom for Closed Captions over HTTP
Zoom expects Closed Caption data to arrive in a continuous sequence of POSTs. Every Meeting and Breakout Room session has a special URL (Breakout Room sessions have an additional “subconfid” parameter). The URL of the POST will specify the destination of the data (the Meeting that the closed captions are associated with).
The following parameter needs to be added to the URL of every POST:
|seq||Must be contained in all POSTs. Counter for all closed caption data posts. Counter must increase by one between posts of new caption data (it must not be increased for retries).||&seq|
The content-type (mimetype) for all POSTs must be text/plain.
All HTTP POSTs sent to the closed caption ingestion point must contain only closed caption data within the content body. Data must not be form encoded.
The body of the POST will contain the text for the closed caption data. A line break may be indicated with '\n'(0x0D) in the closed caption text.
The content has the following format:
1st HTTP post data: I'M SENDING
2nd HTTP post data:SEVERAL CAPTIONS.\n
HTTP POSTs may return the following response codes:
Method not allowed. Not a POST.
Bad request. The meeting has not started.
Unauthorized. Could be due to missing &seq query parameter or missing &id, &signature, &expire or &ns.
Zoom recommends that you retry all codes. This includes the response codes 405, 400, 403 shown above, as well as additional codes such as 408 Request Timeout, 500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable, and 504 Gateway Timeout.
All HTTP POST requests should be performed with a timeout. If a request times out, it should be retried.
When performing retry requests, use randomized binary exponential backoff:
Wait a random period between [0..100] milliseconds and retry; if that fails, wait a random period between [0..200] milliseconds and retry; if that fails, wait a random period between [0..400] milliseconds and retry, and so on. You should retry until it makes more sense to move on to the next closed caption packet (after approximately 5 seconds).
HTTP POST returns Timestamp
A Timestamp value is present in the POST return body and corresponds to the time the POST was processed. It may be used to correct the local clock on a client driving the server. Zoom strongly recommends using this value because local clocks are often poorly synchronized.
Example returned timestamp:
POST /closedcaption?id=200610693&ns=GZHkEA==&expire=86400&sparams=id%2Cns%2Cexpire&signature=nYtXJqRKCW&seq=41&lang=en-US Host: wmcapi.zoom.us:80 Accept: */* Content-Type: text/plain Content-Length: 11 I'M SENDING
POST /closedcaption?id=200610693&ns=GZHkEA==&expire=86400&sparams=id%2Cns%2Cexpire&signature=nYtXJqRKCW&seq=42&lang=en-US Host: wmcapi.zoom.us:80 Accept: */* Content-Type: text/plain Content-Length: 18 SEVERAL CAPTIONS.\n