Skip to main content

How dates and times are handled

The Sally API uses one format everywhere, in both directions: ISO-8601 in UTC with a trailing Z. This page lists the rules, the parameters that filter by date and the one trap to avoid when you filter by day.

The examples show how to turn a day in your time zone into exact UTC bounds and how to convert timestamps from a response back for display. They work as they stand once SALLY_TOKEN and DIRECTORY_ID are set, see the Quickstart.

Quick navigation

  1. The format
  2. The rules
  3. Date filters
  4. Filtering by day
  5. Showing times to users

1. The format​

Every timestamp has the form YYYY-MM-DDTHH:MM:SSZ:

2026-08-27T14:30:00Z

That applies to every date-time field in a response, such as createdOn or startTime, and to every date input in a query string or body.

Exception

followUpMeetingStartTime and followUpMeetingEndTime on a summary section item with sectionType: appointment are a local date and time without a time zone, for example 2026-10-16T09:00:00. What the meeting agreed on is a wall-clock hour, Thursday at nine, and a zone would move that hour for every reader in a different one. Apply the time zone of the people involved instead of reading the value as UTC. Get meeting summaries describes these fields.

2. The rules​

  • Timestamps in responses are always in UTC. The only exception are the two follow-up fields above.
  • Inputs must be UTC. A value without a time zone suffix is read as UTC, never as server time.
  • An explicit offset is converted to the matching UTC instant, so 2026-08-27T16:30:00+02:00 is the same instant as the example above.
  • A date without a time (2026-08-27) counts as midnight UTC.
You sendThe API reads it as
2026-08-27T14:30:00Z2026-08-27T14:30:00Z
2026-08-27T16:30:00+02:002026-08-27T14:30:00Z
2026-08-27T14:30:002026-08-27T14:30:00Z, no suffix means UTC
2026-08-272026-08-27T00:00:00Z, midnight UTC
Recommendation

Always send the full form with Z. Then your request says exactly what the API reads, and nobody has to remember the rules above.

3. Date filters​

These parameters filter by date. Each bound is inclusive:

EndpointParameterFilters onCondition
Appointment listfrom (query)start timeat or after
Appointment listto (query)start timeat or before
Appointment searchfrom (body)start timeat or after
Appointment searchto (body)start timeat or before
Recording listcreatedAfter (query)creation timeat or after
Recording listcreatedBefore (query)creation timeat or before

This request lists the recordings created in September 2026 (UTC):

curl "https://api.sally.io/v1.0/directories/$DIRECTORY_ID/recordings?createdAfter=2026-09-01T00:00:00Z&createdBefore=2026-09-30T23:59:59Z" \
-H "Authorization: Bearer $SALLY_TOKEN"

4. Filtering by day​

Important

In summer a day in Berlin starts two hours before midnight UTC, so from=2026-08-27 is not the German 27th. Convert on your side and send the exact instant you mean, for example 2026-08-26T22:00:00Z.

27 August 2026 in Berlin (UTC+2)Local timeUTC to send
Start of day2026-08-27 00:00:002026-08-26T22:00:00Z
End of day2026-08-27 23:59:592026-08-27T21:59:59Z
What from=2026-08-27 means2026-08-27 02:00:002026-08-27T00:00:00Z

This code computes both bounds for a day in any time zone and lists the appointments that start on that day:

# 27 August 2026 in Berlin (UTC+2) as exact UTC bounds
from="2026-08-26T22:00:00Z"
to="2026-08-27T21:59:59Z"

curl "https://api.sally.io/v1.0/directories/$DIRECTORY_ID/appointments?from=$from&to=$to" \
-H "Authorization: Bearer $SALLY_TOKEN"
Note

Use a time zone name such as Europe/Berlin, not a fixed offset. The name follows daylight saving time, so the same code gives +01:00 in winter and +02:00 in summer.

5. Showing times to users​

Every timestamp in a response is UTC:

200 OK
{
"appointmentId": "d4398f97-cd92-4d21-a6ec-4aab0a85441b",
"subject": "Quarterly planning",
"startTime": "2026-08-27T07:30:00Z",
"endTime": "2026-08-27T08:30:00Z"
}

Convert it to the user's time zone only when you display it, and keep the UTC value for storing and comparing:

# GNU date: 2026-08-27T07:30:00Z shown in Berlin time
TZ=Europe/Berlin date -d '2026-08-27T07:30:00Z' '+%Y-%m-%d %H:%M'
# 2026-08-27 09:30