Curvioo

API

Curvioo API

A read-only HTTP API for turning text into styled Unicode. No key, no signup, no cookies — GET a URL and read the JSON. CORS is open to every origin, so you can call it straight from the browser.

Endpoints

GET /api/v1/health Liveness check. Returns service, version and timestamp.
GET /api/v1/styles All font styles, all Unicode variants, and sample output. Optional ?sample=.
GET /api/v1/styles/<text> Same, with the sample taken from the path.
GET /api/v1/transform/<text> Transform text into every style.
GET /api/v1/transform/<style>/<text> Transform text into one style.
GET /api/v1/transform/b64/<base64url> Same as above for text with spaces, slashes or emoji.
GET /api/v1/transform?text=... Query-string form. Accepts every parameter below.
POST /api/v1/transform JSON or form-encoded body. Same parameters.

Parameters

Query string on GET, JSON or form body on POST. The path variants also read format and unicode from the query string.

text 1–2000 characters The text to convert. Required, except on the path variants where it comes from the URL.
style great-vibes, allura, pinyon, sacramento, dancing, parisienne, alex-brush, homemade-apple, caveat, kaushan Return one font style instead of all ten. An unknown id returns 400.
unicode script, boldScript, fraktur, bold, italic, boldItalic, sans, sansBold, monospace, boldFraktur Override which Unicode mapping is used for unicodeText. Optional.
format json (default), plain, html plain returns bare text; html returns a single <span>. html requires style.

Read this before you build on it

  • The API returns text, never an image. PNG and SVG export are browser-only features of the generator, because they need the licensed webfont and a canvas. There is no rendering endpoint.
  • The ten font styles share two Unicode mappings. Six use script and four use boldScript, so unicodeText repeats across styles. The per-style difference lives in fontFamily. If you want ten visibly different outputs, call with unicode= and pick from the 10 mappings above.
  • Letters only. Digits exist only in bold, sans, sansBold and monospace. Accents, punctuation, emoji and non-Latin scripts pass through unchanged in every mapping.
  • Limit: 1,000 requests per IP per UTC day. Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset.

Response fields

{ ok, input, count, requestedStyle, results[] } — each item in results contains:

unicodeText The styled characters. This is what you copy into a bio, caption or username — it is plain Unicode, not a font.
fontText Your input, unchanged. Pair it with fontFamily to render the real calligraphy face in your own page.
fontFamily The webfont this style expects, e.g. "Great Vibes", cursive. You must load the font yourself.
unicodeStyle Which Unicode mapping produced unicodeText.
htmlSnippet A ready <span> using fontFamily, with your text HTML-escaped.

Errors

Failures return { ok: false, error: { message, details } }. details.supported lists the valid values when you sent a bad id.

400 Empty text, text over the limit, unknown style, unknown unicode variant, invalid base64url, or format=html without a style.
429 More than 1000 requests from one IP in a UTC day. Retry-After and X-RateLimit-Reset give the wait in seconds.
500 A bug on our side. The response body is empty; please report it.

Examples

# every style, full JSON
curl "https://curvioo.com/api/v1/transform/Michael"

# one style, bare text
curl "https://curvioo.com/api/v1/transform/great-vibes/Michael?format=plain"

# pick the Unicode mapping yourself
curl "https://curvioo.com/api/v1/transform/Michael?unicode=fraktur&format=plain"

# text with spaces or symbols: base64url, or POST
curl "https://curvioo.com/api/v1/transform/b64/SGVsbG8gV29ybGQ?format=plain"
curl -X POST https://curvioo.com/api/v1/transform \
  -H 'Content-Type: application/json' \
  -d '{"text":"Hello World","style":"dancing","format":"plain"}'

Guides

The docs page covers the generator itself, which output to use where, and troubleshooting for text that pastes wrong.

Open docs