---
title: "Timezone converter: instant to local time in an IANA time zone and back, with UTC offset and DST state"
method: GET
path: "/v1/time/zone"
tags: ["no-api-key", "time", "timezones"]
---

# Timezone converter: instant to local time in an IANA time zone and back, with UTC offset and DST state

`GET /v1/time/zone`

## Request

- Base URL: `https://api.duoleads.com`
- URL: `https://api.duoleads.com/v1/time/zone`
- Auth: none declared

Timezone converter: convert an instant to wall-clock time in a named IANA time zone, or a wall-clock time in a zone back to an instant. Returns the local date and time, the UTC offset in ±HH:MM and seconds, the zone abbreviation, whether DST is in effect, the ISO week date, and the day of year. Handles the ambiguous and skipped local times at DST boundaries explicitly rather than guessing.

**Output (`data`):** zone, instant (RFC 3339 UTC), epoch_ms, local (YYYY-MM-DDTHH:MM:SS), offset (+HH:MM), offset_seconds, abbreviation, dst, weekday, iso_week {year, week, weekday}, day_of_year, ambiguity (null|repeated|skipped), resolution (null|the ambiguous mode applied), gap (true when a skipped local time was moved forward by the gap length). abbreviation is the runtime (Intl en-US) short name, e.g. GMT+2 or EDT.

Deterministic only when the query fixes the instant; otherwise the answer depends on the current time and is served `no-store`. `meta.deterministic` says which.

Price: $0.05 USDC per call (x402, Base). Route contract version 1.0.0. Docs: https://api.duoleads.com/docs#time-zone

## Query parameters

- `zone` string, required
- `instant` string
- `local` string
- `ambiguous` 'earlier' | 'later' | 'reject'

## Response `200`

Paid and settled. `data` is route-specific; a route that judges its input returns 200 with `data.valid: false` for a bad value.

- object
  - `ok` unknown, required
  - `route` '/v1/time/zone', required
  - `version` '1.0.0', required
  - `data` object, required: zone, instant (RFC 3339 UTC), epoch_ms, local (YYYY-MM-DDTHH:MM:SS), offset (+HH:MM), offset_seconds, abbreviation, dst, weekday, iso_week {year, week, weekday}, day_of_year, ambiguity (null|repeated|skipped), resolution (null|the ambiguous mode applied), gap (true when a skipped local time was moved forward by the gap length). abbreviation is the runtime (Intl en-US) short name, e.g. GMT+2 or EDT.
    - `zone` string, required
    - `instant` string, required
    - `epoch_ms` integer, required
    - `local` string, required
    - `offset` string, required
    - `offset_seconds` integer, required
    - `abbreviation` string, required
    - `dst` boolean, required
    - `weekday` string, required
    - `iso_week` object, required
      - `year` integer, required
      - `week` integer, required
      - `weekday` integer, required
    - `day_of_year` integer, required
    - `ambiguity` string, nullable, required
    - `resolution` string, nullable, required
    - `gap` boolean
  - `meta` Meta, required
    - `disclaimer` string, required: Legal short disclaimer, identical on every response.
    - `request_id` string, required: ULID.
    - `computed_at` string, date-time, required: RFC 3339 UTC with milliseconds.
    - `price_usd` string, required: Decimal string, "0.05".
    - `deterministic` boolean, required
    - `sources` object[]: Present only on routes that read a vendored dataset: the exact edition that answered.
      - `id` string, required
      - `version` string, required
      - `published` string, required
      - `attribution` string
      - `licence` string

## Other responses

- `400`: MISSING_PARAM, INVALID_PARAM or UNSUPPORTED_VALUE. Not charged: validation runs before the paywall.
- `402`: Payment required. No valid PAYMENT-SIGNATURE was supplied: read the base64 PAYMENT-REQUIRED header (or this body) for the price ($0.05 = 50000 atomic USDC on eip155:8453), sign an EIP-3009 authorization and retry. Also returned when settlement is declined (PAYMENT_FAILED). Nothing is charged on a 402.
- `404`: NOT_FOUND: unknown path. Not charged.
- `405`: METHOD_NOT_ALLOWED: only GET and HEAD are served. Not charged.
- `413`: INPUT_TOO_LARGE: a parameter exceeded its documented maximum length. Not charged.
- `500`: INTERNAL: a server bug. Not charged.

---

[API](https://skmtc.dev/duoleads/apis/duo-data-utilities-iban-isin-vat-tax-id-barcode-timezone-geo.md) · [All operations](https://skmtc.dev/duoleads/apis/duo-data-utilities-iban-isin-vat-tax-id-barcode-timezone-geo/llms.txt) · [OpenAPI document](https://skmtc.dev/duoleads/apis/duo-data-utilities-iban-isin-vat-tax-id-barcode-timezone-geo/revisions/18790d59615e?raw)
