Time and timezones, encoding and hashing, colour maths, statistics, checksum validation,
QR codes, placeholder data and reference datasets — all as plain JSON over HTTPS.
No signup, no API key, no client library. Every endpoint on this page is live:
press Run and you are calling the real thing.
Tries a long list of common layouts, including unix timestamps in seconds and milliseconds, and reports which one matched.
Parameter
Type
Description
Value
timerequired
string
Date or timestamp to parse
tz
string
Timezone to assume when the input carries no offset
default UTC
Example response
{
"input": "7 Aug 2026 22:00",
"matched_layout": "2 Jan 2006 15:04",
"rfc3339": "2026-08-07T22:00:00+02:00",
"timezone": "Europe/Stockholm",
"unix": 1786136400,
"weekday": "Friday"
}
GET/v1/time/zone
Details for one timezone, including its clock changes
Current offset and abbreviation, plus every transition in the year — the dates the clocks move and what they move to. Zones without daylight saving report none, which is an answer rather than an omission. /v1/time/zones lists the names.
Parameter
Type
Description
Value
namerequired
string
IANA timezone name
year
integer
Year to list transitions for; defaults to the current one
Times are computed from the date and coordinate, so this works anywhere without a lookup. Above the polar circles the sun may not rise or set at all; those days report what actually happens rather than inventing a time.
Parameter
Type
Description
Value
latrequired
number
Latitude, -90 to 90
lonrequired
number
Longitude, -180 to 180
date
string
Date to compute, YYYY-MM-DD; defaults to today
tz
string
Render the times in this IANA timezone
default UTC
Parses a standard five-field cron expression, or a @macro such as @daily, and returns a plain-English description plus the next fire times in the timezone you choose.
Returns the address the request arrived from, enriched with the country the edge resolved it to. Behind a reverse proxy this reads X-Forwarded-For, but only when the immediate peer is a configured trusted proxy — otherwise a caller could name its own address and country.
Parameter
Type
Description
Value
format
string
json or text; text returns the bare address for shell use
default json
Returns the method, path, query, headers and body exactly as this server received them. The quickest way to find out what your client, proxy or CDN is actually sending.
Useful for exercising a client's error and retry paths. Any code between 200 and 599 is returned verbatim.
Parameter
Type
Description
Value
codepathrequired
integer
HTTP status code to return, 200-599
Example response
{
"description": "The server is temporarily overloaded or down for maintenance. Send Retry-After.",
"name": "Service Unavailable",
"status": 503
}
GET/v1/delay/{seconds}
Respond after a delay
Holds the response open for the requested number of seconds, for testing client timeouts. Capped at 10 seconds.
Parameter
Type
Description
Value
secondspathrequired
number
Seconds to wait, 0-10 (fractions allowed)
Example response
{
"delay_seconds": 2,
"slept_ms": 2001
}
GET/v1/user-agent
Parse a User-Agent string
Parses the caller's User-Agent, or one supplied via ?ua=. Detection is heuristic — user agent strings are a pile of historical fiction — so treat the result as a strong hint rather than fact.
Parameter
Type
Description
Value
ua
string
User-Agent to parse instead of your own
Example response
{
"browser": "Chrome",
"browser_version": "120.0",
"device": "desktop",
"is_bot": false,
"os": "macOS",
"user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36"
}
Random
GET/v1/uuid
Generate UUIDs
Version 4 UUIDs are fully random. Version 7 embeds a millisecond timestamp in the high bits, so they sort chronologically — useful as database keys.
Generate passwords with an honest entropy estimate
Memorable passwords are drawn from the EFF short diceware list; random ones from a character set. Entropy is computed from the actual pool size, so you can see what you are really getting.
Returns SVG by default, which stays sharp at any size and embeds straight into HTML. Ask for png to get a raster image, or json to get the raw module grid and draw it yourself.
Parameter
Type
Description
Value
textrequired
string
Content to encode. Alternatively POST it as the body.
format
string
svg, png or json
default svg
size
integer
Image size in pixels, 64-1024
default 256
level
string
Error correction: low, medium, high or highest
default medium
dark
string
Module colour
default #000000
light
string
Background colour; use none for transparent
default #ffffff
Example response
{
"format": "json",
"level": "medium",
"modules": 25,
"note": "Set format=svg or format=png to receive the image itself.",
"text": "https://example.com"
}
GET/v1/badge
Generate an SVG status badge
The familiar two-tone README badge, rendered server-side as SVG. Drop the URL straight into a Markdown image tag.
Parameter
Type
Description
Value
label
string
Left-hand text
default build
valuerequired
string
Right-hand text
color
string
Right-hand colour: a name like brightgreen, or any hex value
default brightgreen
label_color
string
Left-hand colour
default #555
style
string
flat or square
default flat
Example response
{
"note": "Returns image/svg+xml. Embed with "
}
GET/v1/placeholder/{size}
Placeholder image as SVG
A sized, labelled rectangle for mocking up a layout. SVG rather than a bitmap, so it stays sharp at any scale and costs a few hundred bytes. The label defaults to the dimensions, and the text scales with the box so it fits a favicon and a banner alike.
Parameter
Type
Description
Value
sizepathrequired
string
WIDTHxHEIGHT, or one number for a square. 1 to 4000.
text
string
Label to draw; defaults to the dimensions
bg
string
Background colour, named or hex
default #e2e8f0
fg
string
Text colour, named or hex
default #64748b
format
string
svg for the image, or json to get the URL and metadata back
default svg
Example response
{
"note": "Returns image/svg+xml. Embed with \u003cimg src=\"/v1/placeholder/640x360\"\u003e. Add format=json for the dimensions as data."
}
Fake
GET/v1/fake/person
Generate fake people
Placeholder records for seeding a database or filling a demo. Every value is invented: email domains are RFC 2606 reserved names, so nothing here can reach a real person.
Reports the line and column of the first problem, with the offending text quoted. Being told only "unexpected token" leaves you counting characters by hand. Invalid input is a successful answer to the question, so this returns 200 either way.
Parameter
Type
Description
Value
json
string
The document. Prefer the request body.
Example response
{
"column": 9,
"error": "invalid character '}' looking for beginning of object key string",
"excerpt": "{\"a\": 1,}",
"line": 1,
"offset": 8,
"pointer": " ^",
"valid": false
}
GETPOST/v1/json/schema
Infer a JSON Schema from a document
Produces a draft 2020-12 schema describing the sample. Strings are checked for recognisable formats, and array items are merged so a list of similar objects yields one description rather than many.
Reports which values changed rather than which lines, so reordered keys and reformatting are not differences. Paths are JSON Pointers (RFC 6901). POST {"from": ..., "to": ...}.
Supports $ for the root, .key and ["key"] for members, [0] and [-1] for elements counting from either end, [*] for every element or value, and .. for a recursive search. Filter expressions are not supported — this is a path lookup, not a query language.
The first row names the columns unless header=false, in which case rows come back as arrays. Values that look like numbers or booleans are converted, except where that would lose information — a leading zero is kept as text, because 00123 is an identifier and 123 is not.
Parameter
Type
Description
Value
csv
string
The CSV. Prefer the request body.
delimiter
string
Field separator. Use "tab" for tab-separated.
default ,
header
boolean
Treat the first row as column names
default true
types
boolean
Convert numbers and booleans instead of leaving every value a string
default true
Takes an array of objects. Columns are every key seen across every object, in alphabetical order — a JSON object has no inherent key order to preserve, so sorting is the only stable choice. Objects missing a column get an empty field, and nested values are written as JSON, since CSV cannot hold them.
Parameter
Type
Description
Value
delimiter
string
Field separator. Use "tab" for tab-separated.
default ,
header
boolean
Write the column names as the first row
default true
Returns the document as JSON. A file holding several documents separated by --- comes back as an array, so a Kubernetes manifest survives intact rather than losing everything after the first. YAML permits keys JSON cannot hold — numbers, booleans, whole structures — so those become their text form and are listed in converted_keys rather than changing silently.
Flatten nested JSON to one level, or expand it back
Flattening turns {"a":{"b":1}} into {"a.b":1}, with array elements addressed by index. Expanding reverses it. Useful for environment variables, spreadsheets and anything that cannot nest.
Unicode-aware: accented letters are folded to their ASCII base (Skära becomes skara), and anything left over is dropped.
Parameter
Type
Description
Value
text
string
Text to slugify. Alternatively POST it as the body.
separator
string
Character to join words with
default -
Example response
{
"input": "Räksmörgås på Skärgården!",
"slug": "raksmorgas-pa-skargarden"
}
GETPOST/v1/case
Convert between naming conventions
Returns every common case style at once, so you can pick the one you needed without asking twice.
Parameter
Type
Description
Value
text
string
Text to convert. Alternatively POST it as the body.
Example response
{
"camel": "helloWorldExample",
"constant": "HELLO_WORLD_EXAMPLE",
"dot": "hello.world.example",
"input": "hello world example",
"kebab": "hello-world-example",
"lower": "hello world example",
"pascal": "HelloWorldExample",
"sentence": "Hello world example",
"snake": "hello_world_example",
"title": "Hello World Example",
"upper": "HELLO WORLD EXAMPLE"
}
GET/v1/lorem
Generate placeholder text
Parameter
Type
Description
Value
paragraphs
integer
Number of paragraphs, 1-50
default 3
sentences
integer
Sentences per paragraph, 1-30
default 5
words
integer
If set, return exactly this many words instead, 1-2000
default 0
Example response
{
"paragraphs": [
"Lorem ipsum dolor sit amet, consectetur adipiscing elit."
],
"text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"word_count": 8
}
GETPOST/v1/url/parse
Split a URL into its parts
Breaks a URL into scheme, host, port, path, query and fragment, with the query decoded into an object. The URL is only parsed — nothing is fetched. Repeated query keys are kept as a list rather than collapsed to the last value, and anything worth a second look is called out: credentials in the URL, a non-ASCII or punycode host, a port that is already the default.
Parameter
Type
Description
Value
valuerequired
string
The URL to parse. Percent-encode it, or send it as a POST body.
Returns every digest in one response, so you do not have to guess which one you needed. POST the raw body to hash bytes that do not survive a query string.
Parameter
Type
Description
Value
text
string
Input text. Alternatively POST the raw bytes as the request body.
Splits the token and decodes its header and payload, expanding the standard time claims. The signature is NOT verified — this tells you what a token says, never whether to trust it. POST only, so tokens stay out of browser history and proxy logs.
Returns the ratio and whether it clears WCAG 2.1 AA and AAA for normal and large text. This is the calculation people most often get wrong by hand — the channel values need linearising first.
Parameter
Type
Description
Value
foregroundrequired
string
Text colour
backgroundrequired
string
Background colour
Example response
{
"background": "#ffffff",
"foreground": "#767676",
"passes": {
"aa_large": true,
"aa_normal": true,
"aaa_large": true,
"aaa_normal": false
},
"ratio": 4.54,
"ratio_label": "4.54:1",
"verdict": "Passes AA for all text, AAA for large text only."
}
GET/v1/color/palette
Generate a harmonious palette from one colour
Parameter
Type
Description
Value
colorrequired
string
Hex (#2f6feb), rgb(47,111,235), hsl(220,83%,55%) or a CSS colour name
scheme
string
complementary, analogous, triadic, tetradic, monochromatic or shades
default analogous
count
integer
Colours to return for monochromatic and shades, 2-12
default 5
Covers length, mass, temperature, data, time, speed, area, volume, pressure and energy. Binary and decimal data prefixes are distinct: a MB is 1,000,000 bytes and a MiB is 1,048,576.
Converts between any two bases from 2 to 36, and always shows binary, octal, decimal and hexadecimal alongside. Arbitrary precision, so a value far past 64 bits converts exactly rather than wrapping. Underscores and spaces in the input are ignored, so a grouped literal like 1010_1010 works.
Parameter
Type
Description
Value
valuerequired
string
The number to convert
from
integer
Base of the input, 2 to 36. Prefixes 0x, 0b and 0o set it too.
default 10
to
integer
Base to convert to, 2 to 36. Omit for the common four only.
Verifies the Luhn check digit and names the issuing scheme from the leading digits. Nothing is stored or logged — the query string never reaches the access log — but send test numbers, not live ones.
Validate a Swedish personnummer or organisationsnummer
Handles personnummer, samordningsnummer (coordination numbers, where the day has 60 added) and organisationsnummer, all of which carry a Luhn check digit. Send test numbers only.
Inspect a UUID: version, variant and embedded time
Reads back what /v1/uuid writes. Versions 1, 6 and 7 carry a timestamp, which is returned — worth knowing, because a v1 or v7 identifier leaks when it was created and is a poor choice for anything meant to be unguessable.
Parameter
Type
Description
Value
valuerequired
string
UUID, with or without hyphens or surrounding braces
Parse a semantic version, compare two, or test a range
Splits a version into its parts, and with a second version compares them by the semver.org rules. Prerelease ordering is the part that catches people: 1.0.0-alpha.10 is newer than 1.0.0-alpha.2 because numeric identifiers compare as numbers, and any prerelease is older than the release it precedes. Build metadata is parsed and then ignored in comparisons, as the spec requires.
Parameter
Type
Description
Value
versionrequired
string
Version to parse
compare
string
Second version to compare the first against
range
string
Range to test the version against: ^1.2.0, ~1.2, >=1.2 <2.0.0
{
"categories": [
"biology",
"computing",
"space"
],
"count": 1,
"facts": [
{
"id": 1,
"category": "space",
"text": "A day on Venus is longer than its year: it rotates once every 243 Earth days but orbits the Sun every 225."
}
]
}
Great-circle distance on a spherical earth, good to a few tenths of a percent. The initial and final bearings differ because a great circle is not a constant heading — follow one east from Stockholm and you end up pointing somewhere else by the time you arrive.
Computed from calendar rules, including the Gregorian Easter algorithm, so any year works without a lookup table. Statutory holidays and widely observed non-statutory days are distinguished.
Parameter
Type
Description
Value
countryrequired
string
ISO 3166-1 alpha-2 code; see the supported list in the response
year
integer
Year to compute, 1900-2200; defaults to the current year
include_observances
boolean
Include non-statutory days such as Christmas Eve
default true
Codes, names and minor units — how many decimal places the currency actually has. JPY has none; KWD has three. Getting this wrong is a classic source of rounding bugs. These are static facts, not exchange rates.
What each code means and which RFC defines it. For a server that actually returns a code, use /v1/status/{code} instead.
Parameter
Type
Description
Value
code
integer
Single code to look up
class
string
Restrict to a class: 1xx, 2xx, 3xx, 4xx or 5xx
Example response
{
"count": 1,
"statuses": [
{
"code": 418,
"name": "I'm a Teapot",
"spec": "RFC 2324",
"description": "An April Fools' joke from the Hyper Text Coffee Pot Control Protocol, kept alive by tradition."
}
]
}
GET/v1/currencies/{code}
Look up one currency by ISO 4217 code
The single-currency form of /v1/currencies, plus the countries that use it. Minor units is the field worth reading: it is how many decimal places the currency has, and assuming two is a well-worn way to lose money in JPY or KWD.
A record of what you can newly do with the API, and of anything withdrawn. The same data renders the Changelog section of this page, so polling this endpoint is enough to learn about new endpoints, and to catch a removal before it breaks your code. Bug fixes and internal changes are not listed.
Parameter
Type
Description
Value
limit
integer
Return only the newest N releases; 0 returns all
default 0
type
string
Keep only changes of one type: added, changed or removed
since
string
Only releases on or after this date (YYYY-MM-DD)
version
string
Only the release published as this version
Example response
{
"count": 1,
"latest": "2026-08-09",
"releases": [
{
"date": "2026-08-09",
"version": "v1.0.0",
"title": "Changelog",
"changes": [
{
"type": "added",
"text": "A changelog, so you can see when endpoints arrive.",
"endpoints": [
"/v1/changelog"
]
}
]
}
],
"total": 3
}