Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.2.0
info:
title: FluentEDI Compute 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: Compute
description: Calculation and conversion
paths:
/v1/math/eval:
get:
operationId: math_eval_get
summary: Evaluate a mathematical expression exactly
description: Evaluates arithmetic with correct operator precedence, parentheses, exponentiation, factorials, named variables and 30+ functions. Language models perform arithmetic by pattern-matching and quietly get long multiplications and compounding wrong; this computes the number instead of predicting it.
tags:
- Compute
parameters:
- name: expression
in: query
required: true
description: Expression to evaluate, e.g. "(1+0.07)^30 * 1000".
schema:
description: Expression to evaluate, e.g. "(1+0.07)^30 * 1000".
type: string
maxLength: 2000
examples:
- sqrt(2) * 10^3
- name: variables
in: query
required: false
description: 'Named values usable in the expression, e.g. {"rate": 0.07}.'
schema:
description: 'Named values usable in the expression, e.g. {"rate": 0.07}.'
type: object
default: {}
- name: precision
in: query
required: false
description: Decimal places to round the formatted result to.
schema:
description: Decimal places to round the formatted result to.
type: integer
default: 10
minimum: 0
maximum: 15
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: math_eval_post
summary: Evaluate a mathematical expression exactly
description: Evaluates arithmetic with correct operator precedence, parentheses, exponentiation, factorials, named variables and 30+ functions. Language models perform arithmetic by pattern-matching and quietly get long multiplications and compounding wrong; this computes the number instead of predicting it.
tags:
- Compute
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
expression:
description: Expression to evaluate, e.g. "(1+0.07)^30 * 1000".
type: string
maxLength: 2000
examples:
- sqrt(2) * 10^3
variables:
description: 'Named values usable in the expression, e.g. {"rate": 0.07}.'
type: object
default: {}
precision:
description: Decimal places to round the formatted result to.
type: integer
default: 10
minimum: 0
maximum: 15
required:
- expression
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/unit/convert:
get:
operationId: unit_convert_get
summary: Convert between units of length, mass, temperature, data, time, speed, area…
description: Exact unit conversion across eleven categories, using defined conversion factors rather than remembered approximations. Temperature handles offsets correctly (0°C is 32°F, not 0°F), and binary data prefixes are kept distinct from decimal ones (a GiB is not a GB).
tags:
- Compute
parameters:
- name: value
in: query
required: false
description: Quantity to convert.
schema:
description: Quantity to convert.
type: number
examples:
- 100
- name: from
in: query
required: false
description: Source unit, e.g. "km", "celsius", "gib".
schema:
description: Source unit, e.g. "km", "celsius", "gib".
type: string
examples:
- km
- name: to
in: query
required: false
description: Target unit. Must be in the same category as `from`.
schema:
description: Target unit. Must be in the same category as `from`.
type: string
examples:
- mi
- name: list
in: query
required: false
description: Return every supported unit grouped by category instead of converting.
schema:
description: Return every supported unit grouped by category instead of converting.
type: boolean
default: false
- name: precision
in: query
required: false
description: Decimal places in the rounded result.
schema:
description: Decimal places in the rounded result.
type: integer
default: 6
minimum: 0
maximum: 15
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: unit_convert_post
summary: Convert between units of length, mass, temperature, data, time, speed, area…
description: Exact unit conversion across eleven categories, using defined conversion factors rather than remembered approximations. Temperature handles offsets correctly (0°C is 32°F, not 0°F), and binary data prefixes are kept distinct from decimal ones (a GiB is not a GB).
tags:
- Compute
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
value:
description: Quantity to convert.
type: number
examples:
- 100
from:
description: Source unit, e.g. "km", "celsius", "gib".
type: string
examples:
- km
to:
description: Target unit. Must be in the same category as `from`.
type: string
examples:
- mi
list:
description: Return every supported unit grouped by category instead of converting.
type: boolean
default: false
precision:
description: Decimal places in the rounded result.
type: integer
default: 6
minimum: 0
maximum: 15
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/color/convert:
get:
operationId: color_convert_get
summary: Convert a colour between hex, RGB, HSL and OKLCh, and check WCAG contrast
description: Parses any CSS colour notation and re-emits it in every format including OKLCh. Supply `against` to get the WCAG 2.1 contrast ratio and pass/fail verdicts for normal and large text — the check that decides whether an interface is legible, computed rather than eyeballed.
tags:
- Compute
parameters:
- name: color
in: query
required: true
description: Colour in hex, rgb(), hsl(), or a CSS name.
schema:
description: Colour in hex, rgb(), hsl(), or a CSS name.
type: string
maxLength: 100
examples:
- '#3b82f6'
- name: against
in: query
required: false
description: Optional second colour to compute a WCAG contrast ratio against.
schema:
description: Optional second colour to compute a WCAG contrast ratio against.
type: string
default: ''
maxLength: 100
examples:
- '#ffffff'
- name: shades
in: query
required: false
description: Also return a 50-950 lightness scale built from this hue.
schema:
description: Also return a 50-950 lightness scale built from this hue.
type: boolean
default: 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.
post:
operationId: color_convert_post
summary: Convert a colour between hex, RGB, HSL and OKLCh, and check WCAG contrast
description: Parses any CSS colour notation and re-emits it in every format including OKLCh. Supply `against` to get the WCAG 2.1 contrast ratio and pass/fail verdicts for normal and large text — the check that decides whether an interface is legible, computed rather than eyeballed.
tags:
- Compute
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
color:
description: Colour in hex, rgb(), hsl(), or a CSS name.
type: string
maxLength: 100
examples:
- '#3b82f6'
against:
description: Optional second colour to compute a WCAG contrast ratio against.
type: string
default: ''
maxLength: 100
examples:
- '#ffffff'
shades:
description: Also return a 50-950 lightness scale built from this hue.
type: boolean
default: false
required:
- color
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/money/convert:
get:
operationId: money_convert_get
summary: Convert between 30 currencies at current or historical European Central Bank…
description: 'Converts an amount between currencies using the European Central Bank''s daily reference rates — the closest thing to a neutral, citable exchange rate that exists, reaching back to 1999 for historical dates. Exchange rates are the canonical example of a fact a language model cannot know: they moved after every training cutoff and will move again tomorrow. Rates are published on ECB working days around 16:00 CET; a weekend or holiday query returns the last working day''s rate, and the response always states which date the rate is actually from. These are reference rates for calculation and record-keeping — a bank or card network will apply its own spread on a real transaction.'
tags:
- Compute
parameters:
- name: amount
in: query
required: false
description: Amount to convert.
schema:
description: Amount to convert.
type: number
default: 1
minimum: 0
examples:
- 250
- name: from
in: query
required: true
description: ISO 4217 code of the source currency.
schema:
description: ISO 4217 code of the source currency.
type: string
maxLength: 10
examples:
- USD
- name: to
in: query
required: false
description: Target currency code, or several separated by commas. Empty returns every supported currency.
schema:
description: Target currency code, or several separated by commas. Empty returns every supported currency.
type: string
default: ''
maxLength: 200
- name: date
in: query
required: false
description: Historical date (YYYY-MM-DD, back to 1999-01-04). Empty means the latest published rate.
schema:
description: Historical date (YYYY-MM-DD, back to 1999-01-04). Empty means the latest published rate.
type: string
default: ''
maxLength: 10
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: money_convert_post
summary: Convert between 30 currencies at current or historical European Central Bank…
description: 'Converts an amount between currencies using the European Central Bank''s daily reference rates — the closest thing to a neutral, citable exchange rate that exists, reaching back to 1999 for historical dates. Exchange rates are the canonical example of a fact a language model cannot know: they moved after every training cutoff and will move again tomorrow. Rates are published on ECB working days around 16:00 CET; a weekend or holiday query returns the last working day''s rate, and the response always states which date the rate is actually from. These are reference rates for calculation and record-keeping — a bank or card network will apply its own spread on a real transaction.'
tags:
- Compute
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
amount:
description: Amount to convert.
type: number
default: 1
minimum: 0
examples:
- 250
from:
description: ISO 4217 code of the source currency.
type: string
maxLength: 10
examples:
- USD
to:
description: Target currency code, or several separated by commas. Empty returns every supported currency.
type: string
default: ''
maxLength: 200
date:
description: Historical date (YYYY-MM-DD, back to 1999-01-04). Empty means the latest published rate.
type: string
default: ''
maxLength: 10
required:
- from
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.