Time zones
Schedule a post at the time a person said, in their own time zone, and let Flung work out the instant. Every time is kept in UTC; a zone only says how a time is read and shown.
TL;DR
| Question | Answer |
|---|---|
| What does Flung store? | Every time in UTC. Answers give publishAt in UTC, ending in Z. |
| Can I send a local time? | Yes: publishAt: "2026-11-03T09:00", with no offset, and an optional timeZone such as Europe/Athens. |
Which zone is used without timeZone? | The person's own for an app a person approved and for an agent signed in, the workspace's default for an API key, else UTC. |
| How do I see what was used? | Each post has publishAtLocal and timeZone beside publishAt. Who is calling says the caller's zone and the time there now. |
| Do times with an offset still work? | Yes, exactly as before: 2026-11-03T09:00:00+02:00 and 2026-11-03T07:00:00Z are instants as they stand. |
| What if the clocks change at that time? | A skipped time moves forward by the gap, a repeated one takes the earlier instant, and the answer has a warnings entry. |
Two ways to give a time
publishAt takes either form, on Schedule a post, Change a scheduled post and Schedule a post from a template:
| You send | Flung reads it as |
|---|---|
2026-11-03T07:00:00Z | That instant, 07:00 UTC. |
2026-11-03T09:00:00+02:00 | That instant, 07:00 UTC: the offset says where. |
2026-11-03T09:00 with timeZone: "Europe/Athens" | 09:00 in Athens that day, 07:00 UTC in November. |
2026-11-03T09:00 alone | 09:00 in the caller's zone, as below. |
A local time is the clock on the wall: the same 09:00 in Athens is 07:00 UTC in winter and 06:00 UTC in summer, and Flung follows the change for you. Send a local time when a person said "9am"; send an instant when your own system already has one.
timeZone is an IANA name, such as Europe/Athens, America/New_York, Australia/Sydney or Asia/Kathmandu. Abbreviations such as EET and bare offsets such as +02:00 are not zones, and are refused with 422 and the code invalid_time_zone. With an instant, timeZone changes nothing about when the post goes; it names the zone publishAtLocal is written in.
The caller's zone
When a request names no timeZone, Flung reads a local time in the first of these that is set:
| Order | Zone | Set by |
|---|---|---|
| 1 | The request's timeZone | You, on each call. |
| 2 | The person's own | Their Account page in the Flung portal. Used for an app a person approved with OAuth, and for an AI agent they signed in. |
| 3 | The workspace's default | An owner, in the workspace's settings in the portal. Used for an API key, which belongs to the workspace, not a person. |
| 4 | UTC | Nobody has said a zone. |
A person's zone is set the first time they sign in, from where they sign in from, and they can change it at any time; a zone they chose is never replaced. Who is calling answers the zone a call would use, where it came from (timeZoneSource: user, workspace or default), and the time now in UTC (now) and there (nowLocal):
curl -X GET 'https://api.flung.dev/v1/me' \ --header "Authorization: Bearer $FLUNG_API_KEY"import { Flung } from '@flung.dev/sdk'
const flung = new Flung({ apiKey: process.env.FLUNG_API_KEY! })const result = await flung.me.get()const response = await fetch('https://api.flung.dev/v1/me', { method: 'GET', headers: { 'Authorization': `Bearer ${process.env.FLUNG_API_KEY}`, },})if (!response.ok) throw new Error((await response.json()).error.message)const result = await response.json()Suggest posting times uses the caller's zone too when you leave out its timeZone, and each time it suggests carries that zone's offset, ready for publishAt.
What comes back
Every post, from creating, changing, reading and listing it, and in webhook payloads, says its time three ways:
| Field | Example | Meaning |
|---|---|---|
publishAt | 2026-11-03T07:00:00.000Z | When it publishes, in UTC. |
publishAtLocal | 2026-11-03T09:00:00+02:00 | The same instant as the local time in timeZone, with that day's offset. |
timeZone | Europe/Athens | The zone the time was given in. A post from before zones were kept shows the caller's. |
Show a person publishAtLocal, and compare and sort by publishAt.
When the clocks change
Twice a year, many zones skip an hour or repeat one. In Athens the clocks go from 03:00 to 04:00 on the last Sunday of March, and from 04:00 back to 03:00 on the last Sunday of October.
You send, in Europe/Athens | That day | Flung schedules | warnings |
|---|---|---|---|
2026-03-29T03:30 | 03:30 never happens | 04:30 local, 01:30Z: moved forward by the gap | local_time_skipped |
2026-10-25T03:30 | 03:30 happens twice | The first one, still on summer time, 00:30Z | local_time_ambiguous |
2026-10-25T04:00 | Once | 02:00Z | None |
A warnings entry has a code and a message for a person, and appears only on the answer that created or changed the post. To pick the second 03:30 of a repeated hour, send it with its offset, 2026-10-25T03:30:00+02:00.
AI agents
The MCP server works the same way, so an agent never does time-zone arithmetic. Its scheduling tools take publishAt as the local time the person said, and timeZone only when they named a place ("9am Athens time"). The answer gives publishAt in UTC with publishAtLocal and timeZone, so the agent can confirm the time back in the person's own words. The get_time tool says the person's zone and the time there now, for turning "tomorrow morning" into a date. See schedule_post and get_time in the tool reference.
In the portal
On the Account page, the Time zone field shows the zone dates are written in for you, with its offset from UTC and the time there now. It says when it was set from your location; choose another at any time. A workspace's owners set its default zone, for its API keys, in the workspace's settings. Every date and time in the portal is shown in your zone, with the zone's short name where the time matters. To move a scheduled post, open it on the Activity page and choose Change time: pick the new time in your zone, and the field shows it in UTC too before you save.