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
scriptand four useboldScript, sounicodeTextrepeats across styles. The per-style difference lives infontFamily. If you want ten visibly different outputs, call withunicode=and pick from the 10 mappings above. - Letters only. Digits exist only in
bold,sans,sansBoldandmonospace. 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-RemainingandX-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