Webhook HTTP requests handling

Description
I’m working on a new integration with Zoom via webhooks. To help us better plan for incoming data volume and load, we would like to know:

  • if there is a known max possible size of the webhook log events?
  • is it always going to be one event log per HTTP request?
  • is there any way to differentiate between a challenge-response check HTTP request and a normal event notification HTTP requests without having to parse the JSON payload? Is there something in the headers we could use?

Any guidance for the above questions would be much appreciated.

Hi @rishi-dev
Thanks for reaching out to the Zoom Developer Forum and welcome to our community!
I am happy to help here!

I see that you are interested in implementing webhooks!
To answer some of your queries:

if there is a known max possible size of the webhook log events?

What do you mean by this? the size of the payload that you will receive?

is it always going to be one event log per HTTP request?

Yes, this is correct. Each notification will be an individual post request.

is there any way to differentiate between a challenge-response check HTTP request and a normal event notification HTTP request without having to parse the JSON payload? Is there something in the headers we could use?

You will always receive headers and payload, so a way to differentiate if it’s a challenge-repose-check would be comparing the name of the event, so if the event in your payload is “endpoint.url_validation” you would have to create a challenge-response and send it back to Zoom; if not, then you should be good to start receiving events in your application.

Hope this helps!
Elisa

thanks for the info Elisa!

What do you mean by this? the size of the payload that you will receive?

yes, I am talking about the size of the payload per request.

You will always receive headers and payload, so a way to differentiate if it’s a challenge-repose-check would be comparing the name of the event, so if the event in your payload is “endpoint.url_validation” you would have to create a challenge-response and send it back to Zoom; if not, then you should be good to start receiving events in your application.

This makes sense. However, I was wondering if there is a way to use only the headers, without parsing the payload, to check if the request contains a challenge-response-check? If there is no way currently, will there be new headers added in the future to help us differentiate? It would be more efficient for us to avoid parsing the JSON payload to differentiate between request types.

Of cours @rishi-dev happy to help!

As for right now, we have a new option to verify your own headers:

https://marketplace.zoom.us/docs/api-reference/webhook-reference/#verify-with-your-own-header

To enable this feature you will need to reach out to support here:

About the size of the payload, it varies depending on the event you are getting, so I do not think we have a specific size. For example:

This is a payload you will get when creating a user:

{
  "event": "string",
  "event_ts": "integer",
  "payload": {
    "account_id": "string",
    "operator": "string",
    "operator_id": "string",
    "creation_type": "string",
    "object": {
      "id": "string",
      "first_name": "string",
      "last_name": "string",
      "display_name": "string",
      "email": "string",
      "type": "integer"
    }
  }
}

vs the payload you will create when recordings have been completed, which might be a little longer:

{
  "event": "string",
  "event_ts": "integer",
  "payload": {
    "account_id": "string",
    "object": {
      "id": "integer",
      "uuid": "string",
      "host_id": "string",
      "account_id": "string",
      "password": "string",
      "topic": "string",
      "type": "integer",
      "start_time": "string",
      "timezone": "string",
      "host_email": "string",
      "duration": "integer",
      "share_url": "string",
      "total_size": "integer",
      "recording_count": "integer",
      "on_prem": "boolean",
      "thumbnail_links": [
        "string"
      ],
      "recording_files": [
        {
          "id": "string",
          "meeting_id": "string",
          "recording_start": "string",
          "recording_end": "string",
          "file_type": "string",
          "file_name": "string",
          "file_size": "integer",
          "file_extension": "string",
          "play_url": "string",
          "download_url": "string",
          "status": "string",
          "recording_type": "string"
        }
      ],
      "participant_audio_files": [
        {
          "id": "string",
          "recording_start": "string",
          "recording_end": "string",
          "file_type": "string",
          "file_name": "string",
          "file_size": "integer",
          "file_extension": "string",
          "play_url": "string",
          "download_url": "string",
          "status": "string",
          "recording_type": "string"
        }
      ],
      "recording_play_passcode": "string"
    }
  },
  "download_token": "string"
}

Hope this helps,
Elisa

This topic was automatically closed 368 days after the last reply. New replies are no longer allowed.