API Endpoints
- GET
/users/{userId}/recordings- List cloud recordings - GET
/phone/users/{userId}/call_logs- Get user’s call logs - GET
/phone/sms/sessions- List SMS sessions - GET
/phone/sms/sessions/{sessionId}- Get SMS session details
Description
We’re implementing a data sync system that needs to fetch historical data across large date ranges. Based on form post "estrictions-on-retrieving-data-from-cloud-recordings-api, we understand recordings are limited to “one month range” within a 6-month look-back window, but several critical details remain unclear:
1. Date Parameter Boundaries (All Endpoints):
- Are
fromandtoparameters inclusive or exclusive on either end? - Example: Does
from=2025-01-01&to=2025-01-31include both Jan 1 and Jan 31, or is one boundary exclusive? - Why this matters: When splitting large ranges into one-month chunks to comply with API limits, we need to know whether to use:
from=2025-01-01&to=2025-01-31thenfrom=2025-01-31&to=2025-02-28(1-day overlap if both inclusive)from=2025-01-01&to=2025-01-31thenfrom=2025-02-01&to=2025-02-28(no overlap if both inclusive)
2. “One Month” Range Calculation:
- The recordings documentation and SMS sessions documentation both state “one month” limits
- Does “one month” mean:
- A fixed 30 or 31 days maximum?
- “Same date, previous month” (e.g., April 7 to May 7, which varies: 28-31 days)?
- Exactly one calendar month (e.g., Jan 1 to Jan 31)?
- Questions about boundary cases:
from=2025-01-31&to=2025-02-28= 28 days spanning 2 months (valid?)from=2025-01-31&to=2025-03-03= 31 days but spans 3 calendar months (valid?)from=2024-01-31&to=2024-02-29= 29 days in leap year (valid?)from=2024-02-29&to=2024-03-29= 29 days starting from leap day (valid?)
- Should we use fixed 28-day chunks to be safe, or calculate based on actual month lengths?
3. “One Month” Limit for Call Logs:
- Recordings and SMS sessions have clear one-month limits
- Does the call logs endpoint (
/phone/users/{userId}/call_logs) have the same one-month chunking requirement? - Or can we use the full 6-month range in a single request?
4. Pagination Stability (All Endpoints):
- What is the default sort order for results?
- If new data is added during pagination (new recordings/calls/SMS between page requests), can items shift between pages?
- Does
next_page_tokenguarantee stable/consistent results, or should we implement client-side deduplication? - Why this matters: Without stable ordering, the same item could appear twice or be missed entirely when paginating through large result sets
5. SMS Two-Level Filtering Behavior:
- We notice that BOTH
/phone/sms/sessionsand/phone/sms/sessions/{sessionId}acceptfrom/toparameters - This suggests a two-level filtering approach:
- Filter sessions by activity using
filter_typeparameter (which specifies:sent_message_time,received_message_time,last_message_time, orsent_received_message_time) - Filter messages within each session using
from/toon the session details endpoint
- Filter sessions by activity using
- Critical Questions:
- For session details endpoint: The
from/toparameters don’t have an accompanyingfilter_typeparameter - which message timestamp field do they filter on?- Is it
sent_time,received_time,date_time,created_at, or something else? - Does it filter on sent messages only, received messages only, or both?
- Is it
- Why are two levels of date filtering needed? Does this mean sessions span longer than one month?
- Scenario 1: Session with continuous activity Jan 1 through Mar 1
- Query:
from=2025-02-01&to=2025-02-28&filter_type=sent_received_message_time - Will this session be included?
- Query:
- Scenario 2: Session with messages in Jan (1st-31st) and late Mar (16th-30th), but NO messages in Feb or early Mar (1st-15th)
- Query:
from=2025-02-01&to=2025-03-15&filter_type=sent_received_message_time - Will this session be included? (The date range spans a gap in activity)
- If included, what happens when we query session details with the same date range - do we get an empty message list?
- Query:
- When we query session details with
from=2025-02-01&to=2025-02-28, do we get only messages from that range, or all messages in the session? - For incremental sync: Should we query sessions with a wide date range (e.g., last 6 months) and rely on message-level filtering in step 2?
- Or should we use the same date range for both session filtering and message filtering?
- For session details endpoint: The
6. SMS Session Definition and Lifecycle:
- What exactly is an “SMS session”?
- Does a session represent:
- A conversation thread (potentially long-lived, spanning months)?
- A time-based window (e.g., all messages in a 24-hour period)?
- Something else?
- Can new messages be added to an existing session over time?
- What determines when a session ends and a new one begins?
- If sessions have a
creation_timefield, what does it represent? The time of the first message, or when Zoom created the session record? - For incremental sync: If sessions are long-lived conversation threads, we need to:
- Find all sessions that had activity since last sync (using
filter_type=sent_received_message_time) - For each session, fetch only messages since last sync (using
from/toon session details)
- Is this the intended workflow?
- Find all sessions that had activity since last sync (using
7. SMS Sessions from Parameter Bug Status:
Forum post “broken-from-date-filter-for-phone-sms-sessions-endpoint” reported that the from parameter was being ignored on /phone/sms/sessions
- Has this been resolved?
- Does it affect both the session list endpoint and the session details endpoint?
How To Reproduce
# Example 1: Date boundary ambiguity
# If both parameters are inclusive and we split a 60-day range:
GET https://api.zoom.us/v2/users/me/recordings?from=2025-01-01&to=2025-01-31
GET https://api.zoom.us/v2/users/me/recordings?from=2025-01-31&to=2025-03-02
# Result: Jan 31 recordings appear in BOTH responses (duplicate)
# If one is exclusive:
GET https://api.zoom.us/v2/users/me/recordings?from=2025-01-01&to=2025-01-31
GET https://api.zoom.us/v2/users/me/recordings?from=2025-02-01&to=2025-03-02
# Result: Jan 31 recordings might be missed entirely (gap)
# Example 2: "One month" boundary cases
GET https://api.zoom.us/v2/users/me/recordings?from=2025-01-31&to=2025-02-28
# 28 days, spans 2 calendar months - valid?
GET https://api.zoom.us/v2/users/me/recordings?from=2025-01-31&to=2025-03-03
# 31 days, spans 3 calendar months - valid?
GET https://api.zoom.us/v2/users/me/recordings?from=2024-02-29&to=2024-03-29
# 29 days starting from leap day - valid?
# Example 3: SMS session filtering with activity gaps
# Scenario: Session spanning Jan 1 - Mar 30 with messages:
# - Jan 5, Jan 10, Jan 20 (active in January)
# - [NO activity Feb 1 - Mar 15]
# - Mar 16, Mar 20, Mar 25 (active in late March)
# Question 1: Query covering the gap period
GET https://api.zoom.us/v2/phone/sms/sessions?from=2025-02-01&to=2025-03-15&filter_type=sent_received_message_time
# Does this return the session? (Date range has NO message activity, but session exists)
# Question 2: If session IS returned, what do we get for messages?
GET https://api.zoom.us/v2/phone/sms/sessions/{sessionId}?from=2025-02-01&to=2025-03-15
# Empty list? Or does it ignore the from/to and return all messages (Jan + Mar)?
# Example 4: SMS two-level filtering - which timestamp field is used?
# Scenario: Session with messages:
# - Message A: sent Jan 5, received Jan 5
# - Message B: sent Feb 10, received Feb 10
# - Message C: sent Mar 15, received Mar 15
# Step 1: Get sessions with Feb activity
GET https://api.zoom.us/v2/phone/sms/sessions?from=2025-02-01&to=2025-02-28&filter_type=sent_received_message_time
# Question: Does this return the session (it has a Feb 10 message)?
# Step 2: Get messages from that session
GET https://api.zoom.us/v2/phone/sms/sessions/{sessionId}?from=2025-02-01&to=2025-02-28
# Questions:
# - Which timestamp field is being filtered (sent_time, received_time, date_time, created_at)?
# - Does this return only Message B (Feb 10)?
# - Or all messages (A, B, C) because there's no filter_type to specify sent vs received?
# - Or does it default to filtering on both sent AND received timestamps (like sent_received_message_time)?
# Example 5: Incremental sync workflow
# Last sync was Jan 15, now it's Feb 20
# Option A: Use narrow date range for both levels
GET https://api.zoom.us/v2/phone/sms/sessions?from=2025-01-15&to=2025-02-20&filter_type=sent_received_message_time
# Then for each session:
GET https://api.zoom.us/v2/phone/sms/sessions/{sessionId}?from=2025-01-15&to=2025-02-20
# Option B: Use wide range for sessions, narrow for messages
GET https://api.zoom.us/v2/phone/sms/sessions?from=2024-08-01&to=2025-02-20&filter_type=sent_received_message_time
# Then for each session:
GET https://api.zoom.us/v2/phone/sms/sessions/{sessionId}?from=2025-01-15&to=2025-02-20
# Which approach is correct/more efficient?
Authentication: Server-to-Server OAuth
Any clarification on these points would help us implement reliable data synchronization without gaps or duplicates.
Thank you!