Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.2.0
info:
title: FluentEDI Time API
version: 1.1.0
summary: Deterministic tools for AI agents. No key, no signup, no SDK.
description: 'A public HTTP API of deterministic tools for the work a language model cannot do reliably by reasoning: knowing the current time in any timezone and whether an instant falls inside a window, exact arithmetic, hashing and signature verification, canonicalizing and content-addressing JSON, repairing malformed JSON and pinpointing where it broke, querying and diffing structured data, parsing CSV correctly, converting units, colours and currencies at live ECB rates, testing regular expressions…'
license:
name: Free to use
identifier: MIT
servers:
- url: https://fluentedi.com
tags:
- name: Time
description: Time, dates and windows
paths:
/v1/time/now:
get:
operationId: time_now_get
summary: Current date and time in any IANA timezone
description: 'Returns the authoritative current time in one or more timezones, with UTC offset, ISO week number, day of year, weekend flag, and daylight-saving state. Use this instead of guessing the date: a language model has no clock, and its training cutoff is not today.'
tags:
- Time
parameters:
- name: timezone
in: query
required: false
description: IANA timezone identifier, e.g. "UTC", "America/New_York", "Asia/Kolkata", "Europe/London".
schema:
description: IANA timezone identifier, e.g. "UTC", "America/New_York", "Asia/Kolkata", "Europe/London".
type: string
default: UTC
examples:
- America/New_York
- name: also
in: query
required: false
description: Additional timezones to report alongside the primary one.
schema:
description: Additional timezones to report alongside the primary one.
type: array
default: []
items:
type: string
examples:
- - Asia/Tokyo
- Europe/Berlin
responses:
'200':
description: Tool result.
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
tool:
type: string
result:
type: object
description: Tool-specific result payload.
'400':
description: Invalid input. The body carries the parameter schema and working examples.
post:
operationId: time_now_post
summary: Current date and time in any IANA timezone
description: 'Returns the authoritative current time in one or more timezones, with UTC offset, ISO week number, day of year, weekend flag, and daylight-saving state. Use this instead of guessing the date: a language model has no clock, and its training cutoff is not today.'
tags:
- Time
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
timezone:
description: IANA timezone identifier, e.g. "UTC", "America/New_York", "Asia/Kolkata", "Europe/London".
type: string
default: UTC
examples:
- America/New_York
also:
description: Additional timezones to report alongside the primary one.
type: array
default: []
items:
type: string
examples:
- - Asia/Tokyo
- Europe/Berlin
required: []
additionalProperties: false
responses:
'200':
description: Tool result.
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
tool:
type: string
result:
type: object
description: Tool-specific result payload.
'400':
description: Invalid input. The body carries the parameter schema and working examples.
/v1/time/convert:
get:
operationId: time_convert_get
summary: Convert a timestamp between timezones
description: Converts one instant into any number of timezones, handling daylight saving transitions correctly. Naive inputs (no Z or offset) are read as wall-clock time in `from`; inputs carrying an offset are absolute.
tags:
- Time
parameters:
- name: time
in: query
required: false
description: 'The instant to convert: ISO 8601, a naive wall-clock time, a unix timestamp, or "now".'
schema:
description: 'The instant to convert: ISO 8601, a naive wall-clock time, a unix timestamp, or "now".'
type: string
default: now
examples:
- '2026-08-22T14:30:00'
- name: from
in: query
required: false
description: Timezone the input is expressed in (used only when it carries no offset).
schema:
description: Timezone the input is expressed in (used only when it carries no offset).
type: string
default: UTC
examples:
- America/New_York
- name: to
in: query
required: true
description: Target timezones.
schema:
description: Target timezones.
type: array
default:
- UTC
items:
type: string
examples:
- - Asia/Tokyo
- America/New_York
responses:
'200':
description: Tool result.
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
tool:
type: string
result:
type: object
description: Tool-specific result payload.
'400':
description: Invalid input. The body carries the parameter schema and working examples.
post:
operationId: time_convert_post
summary: Convert a timestamp between timezones
description: Converts one instant into any number of timezones, handling daylight saving transitions correctly. Naive inputs (no Z or offset) are read as wall-clock time in `from`; inputs carrying an offset are absolute.
tags:
- Time
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
time:
description: 'The instant to convert: ISO 8601, a naive wall-clock time, a unix timestamp, or "now".'
type: string
default: now
examples:
- '2026-08-22T14:30:00'
from:
description: Timezone the input is expressed in (used only when it carries no offset).
type: string
default: UTC
examples:
- America/New_York
to:
description: Target timezones.
type: array
default:
- UTC
items:
type: string
examples:
- - Asia/Tokyo
- America/New_York
required:
- to
additionalProperties: false
responses:
'200':
description: Tool result.
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
tool:
type: string
result:
type: object
description: Tool-specific result payload.
'400':
description: Invalid input. The body carries the parameter schema and working examples.
/v1/time/add:
get:
operationId: time_add_get
summary: Add or subtract a duration from a date, calendar-aware
description: Adds years, months, weeks, days, hours, minutes and seconds to an instant. Calendar units (years, months, weeks, days) move wall-clock time and clamp overflow — Jan 31 plus one month is Feb 28 or 29, never Mar 3. Clock units (hours, minutes, seconds) add exact elapsed time and therefore cross DST boundaries.
tags:
- Time
parameters:
- name: time
in: query
required: false
description: 'Starting instant: ISO 8601, unix timestamp, or "now".'
schema:
description: 'Starting instant: ISO 8601, unix timestamp, or "now".'
type: string
default: now
- name: timezone
in: query
required: false
description: IANA timezone identifier, e.g. "UTC", "America/New_York", "Asia/Kolkata", "Europe/London".
schema:
description: IANA timezone identifier, e.g. "UTC", "America/New_York", "Asia/Kolkata", "Europe/London".
type: string
default: UTC
examples:
- America/New_York
- name: years
in: query
required: false
description: Years to add (negative subtracts).
schema:
description: Years to add (negative subtracts).
type: integer
default: 0
- name: months
in: query
required: false
description: Months to add (negative subtracts). Day-of-month is clamped.
schema:
description: Months to add (negative subtracts). Day-of-month is clamped.
type: integer
default: 0
- name: weeks
in: query
required: false
description: Weeks to add (negative subtracts).
schema:
description: Weeks to add (negative subtracts).
type: integer
default: 0
- name: days
in: query
required: false
description: Calendar days to add (negative subtracts).
schema:
description: Calendar days to add (negative subtracts).
type: integer
default: 0
- name: hours
in: query
required: false
description: Exact hours to add (negative subtracts).
schema:
description: Exact hours to add (negative subtracts).
type: number
default: 0
- name: minutes
in: query
required: false
description: Exact minutes to add (negative subtracts).
schema:
description: Exact minutes to add (negative subtracts).
type: number
default: 0
- name: seconds
in: query
required: false
description: Exact seconds to add (negative subtracts).
schema:
description: Exact seconds to add (negative subtracts).
type: number
default: 0
- name: business_days
in: query
required: false
description: Weekdays to add, skipping Saturday and Sunday.
schema:
description: Weekdays to add, skipping Saturday and Sunday.
type: integer
default: 0
responses:
'200':
description: Tool result.
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
tool:
type: string
result:
type: object
description: Tool-specific result payload.
'400':
description: Invalid input. The body carries the parameter schema and working examples.
post:
operationId: time_add_post
summary: Add or subtract a duration from a date, calendar-aware
description: Adds years, months, weeks, days, hours, minutes and seconds to an instant. Calendar units (years, months, weeks, days) move wall-clock time and clamp overflow — Jan 31 plus one month is Feb 28 or 29, never Mar 3. Clock units (hours, minutes, seconds) add exact elapsed time and therefore cross DST boundaries.
tags:
- Time
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
time:
description: 'Starting instant: ISO 8601, unix timestamp, or "now".'
type: string
default: now
timezone:
description: IANA timezone identifier, e.g. "UTC", "America/New_York", "Asia/Kolkata", "Europe/London".
type: string
default: UTC
examples:
- America/New_York
years:
description: Years to add (negative subtracts).
type: integer
default: 0
months:
description: Months to add (negative subtracts). Day-of-month is clamped.
type: integer
default: 0
weeks:
description: Weeks to add (negative subtracts).
type: integer
default: 0
days:
description: Calendar days to add (negative subtracts).
type: integer
default: 0
hours:
description: Exact hours to add (negative subtracts).
type: number
default: 0
minutes:
description: Exact minutes to add (negative subtracts).
type: number
default: 0
seconds:
description: Exact seconds to add (negative subtracts).
type: number
default: 0
business_days:
description: Weekdays to add, skipping Saturday and Sunday.
type: integer
default: 0
required: []
additionalProperties: false
responses:
'200':
description: Tool result.
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
tool:
type: string
result:
type: object
description: Tool-specific result payload.
'400':
description: Invalid input. The body carries the parameter schema and working examples.
/v1/time/diff:
get:
operationId: time_diff_get
summary: Duration between two dates, in every unit
description: 'Computes the elapsed time between two instants: exact totals in each unit, a calendar breakdown (years/months/days rather than ''thirteen and a half months''), the count of weekdays in between, and a human phrase. Negative when `to` precedes `from`.'
tags:
- Time
parameters:
- name: from
in: query
required: false
description: 'Start instant: ISO 8601, unix timestamp, or "now".'
schema:
description: 'Start instant: ISO 8601, unix timestamp, or "now".'
type: string
default: now
examples:
- '1990-05-14'
- name: to
in: query
required: false
description: 'End instant: ISO 8601, unix timestamp, or "now".'
schema:
description: 'End instant: ISO 8601, unix timestamp, or "now".'
type: string
default: now
- name: timezone
in: query
required: false
description: IANA timezone identifier, e.g. "UTC", "America/New_York", "Asia/Kolkata", "Europe/London".
schema:
description: IANA timezone identifier, e.g. "UTC", "America/New_York", "Asia/Kolkata", "Europe/London".
type: string
default: UTC
examples:
- America/New_York
responses:
'200':
description: Tool result.
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
tool:
type: string
result:
type: object
description: Tool-specific result payload.
'400':
description: Invalid input. The body carries the parameter schema and working examples.
post:
operationId: time_diff_post
summary: Duration between two dates, in every unit
description: 'Computes the elapsed time between two instants: exact totals in each unit, a calendar breakdown (years/months/days rather than ''thirteen and a half months''), the count of weekdays in between, and a human phrase. Negative when `to` precedes `from`.'
tags:
- Time
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
from:
description: 'Start instant: ISO 8601, unix timestamp, or "now".'
type: string
default: now
examples:
- '1990-05-14'
to:
description: 'End instant: ISO 8601, unix timestamp, or "now".'
type: string
default: now
timezone:
description: IANA timezone identifier, e.g. "UTC", "America/New_York", "Asia/Kolkata", "Europe/London".
type: string
default: UTC
examples:
- America/New_York
required: []
additionalProperties: false
responses:
'200':
description: Tool result.
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
tool:
type: string
result:
type: object
description: Tool-specific result payload.
'400':
description: Invalid input. The body carries the parameter schema and working examples.
/v1/time/window:
get:
operationId: time_window_get
summary: Test whether an instant falls inside a time window, and by how much it misses
description: 'Answers the questions a deadline actually poses: is this instant inside the window, how long until it opens or closes, and if it is outside, by how much. Optionally compares two windows for overlap. A window comparison that silently succeeds against the wrong bounds is a failure mode that does not raise an error anywhere — the ship window is missed, or the ASN is late, and the only symptom is a chargeback later. This computes the boundary instead of assuming it.'
tags:
- Time
parameters:
- name: start
in: query
required: true
description: 'Window opens at this instant: ISO 8601, unix timestamp, or "now".'
schema:
description: 'Window opens at this instant: ISO 8601, unix timestamp, or "now".'
type: string
examples:
- '2026-08-24T09:00:00Z'
- name: end
in: query
required: false
description: Window closes at this instant. Omit if using `duration_hours`.
schema:
description: Window closes at this instant. Omit if using `duration_hours`.
type: string
default: ''
- name: duration_hours
in: query
required: false
description: Window length in hours, used when `end` is omitted.
schema:
description: Window length in hours, used when `end` is omitted.
type: number
default: 0
- name: instant
in: query
required: false
description: The instant to test against the window.
schema:
description: The instant to test against the window.
type: string
default: now
- name: timezone
in: query
required: false
description: IANA timezone used to read naive inputs and render output.
schema:
description: IANA timezone used to read naive inputs and render output.
type: string
default: UTC
examples:
- America/New_York
- name: compare_start
in: query
required: false
description: Start of a second window, to test for overlap with the first.
schema:
description: Start of a second window, to test for overlap with the first.
type: string
default: ''
- name: compare_end
in: query
required: false
description: End of the second window.
schema:
description: End of the second window.
type: string
default: ''
responses:
'200':
description: Tool result.
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
tool:
type: string
result:
type: object
description: Tool-specific result payload.
'400':
description: Invalid input. The body carries the parameter schema and working examples.
post:
operationId: time_window_post
summary: Test whether an instant falls inside a time window, and by how much it misses
description: 'Answers the questions a deadline actually poses: is this instant inside the window, how long until it opens or closes, and if it is outside, by how much. Optionally compares two windows for overlap. A window comparison that silently succeeds against the wrong bounds is a failure mode that does not raise an error anywhere — the ship window is missed, or the ASN is late, and the only symptom is a chargeback later. This computes the boundary instead of assuming it.'
tags:
- Time
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
start:
description: 'Window opens at this instant: ISO 8601, unix timestamp, or "now".'
type: string
examples:
- '2026-08-24T09:00:00Z'
end:
description: Window closes at this instant. Omit if using `duration_hours`.
type: string
default: ''
duration_hours:
description: Window length in hours, used when `end` is omitted.
type: number
default: 0
instant:
description: The instant to test against the window.
type: string
default: now
timezone:
description: IANA timezone used to read naive inputs and render output.
type: string
default: UTC
examples:
- America/New_York
compare_start:
description: Start of a second window, to test for overlap with the first.
type: string
default: ''
compare_end:
description: End of the second window.
type: string
default: ''
required:
- start
additionalProperties: false
responses:
'200':
description: Tool result.
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
tool:
type: string
result:
type: object
description: Tool-specific result payload.
'400':
description: Invalid input. The body carries the parameter schema and working examples.
/v1/time/zones:
get:
operationId: time_zones_get
summary: List or search IANA timezone identifiers with current offsets
description: Every IANA timezone the runtime supports, with its current UTC offset and local time. Search by city, region or offset to resolve a vague location like "Bangalore" to a valid identifier before calling other time tools.
tags:
- Time
parameters:
- name: search
in: query
required: false
description: Case-insensitive substring filter, e.g. "kolkata", "america/", "+05:30".
schema:
description: Case-insensitive substring filter, e.g. "kolkata", "america/", "+05:30".
type: string
default: ''
- name: limit
in: query
required: false
description: Maximum results to return.
schema:
description: Maximum results to return.
type: integer
default: 50
minimum: 1
maximum: 700
responses:
'200':
description: Tool result.
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
tool:
type: string
result:
type: object
description: Tool-specific result payload.
'400':
description: Invalid input. The body carries the parameter schema and working examples.
post:
operationId: time_zones_post
summary: List or search IANA timezone identifiers with current offsets
description: Every IANA timezone the runtime supports, with its current UTC offset and local time. Search by city, region or offset to resolve a vague location like "Bangalore" to a valid identifier before calling other time tools.
tags:
- Time
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
search:
description: Case-insensitive substring filter, e.g. "kolkata", "america/", "+05:30".
type: string
default: ''
limit:
description: Maximum results to return.
type: integer
default: 50
minimum: 1
maximum: 700
required: []
additionalProperties: false
responses:
'200':
description: Tool result.
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
tool:
type: string
result:
type: object
description: Tool-specific result payload.
'400':
description: Invalid input. The body carries the parameter schema and working examples.