AnvilJSON utilities

Anvil › Docs › /v1/lorem

Lorem ipsum API: placeholder paragraphs, sentences or words

Need filler text for a mock-up, a screenshot or a CI fixture? Ask for a number of paragraphs, sentences or words and get classic-looking Latin placeholder copy back as JSON. Pass the same seed to get the same sample every time — useful for tests and docs.

In one line: GET /v1/lorem?paragraphs=2&seed=42 returns JSON. No key, CORS on, 60 requests a minute.
GET

/v1/lorem

Lorem ipsum placeholder text: paragraphs, sentences or words. Change the values and press Send request to call the live API.

Parameters

NameTypeWhat it doesDefault
paragraphsintegerHow many paragraphs (1–20). Wins over sentences/words if several are set.—
sentencesintegerHow many sentences (1–100)—
wordsintegerHow many words (1–500)—
startbooleanBegin with classic Lorem ipsum… (default true)true
htmlbooleanAlso return an html field with <p> wrappersfalse
seedstringRepeatable sample (integer or short string)—

Example

Request:

GET https://api.oddlathe.com/v1/lorem?paragraphs=2&seed=42

Response (generated by the real code when these docs were last built; random or time-based values will differ for you):

{
 "mode": "paragraphs",
 "count": 2,
 "start_with_lorem": true,
 "paragraphs": [
  "Lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor incididunt. Nisl habitant odio aliquam in ex, placerat montes veniam faucibus elementum sit. Pharetra varius elit quis faucibus elementum cupidatat vitae faucibus eu volutpat incididunt habitant. Sapien fames vestibulum tortor, elit pulvinar officia irure eu consectetur. Ultricies exercitation nostrud nunc occaecat anim fugiat proin aliquam sit pellentesque lectus. Erat fames amet ultricies habitant lacinia nulla erat ex exercitation dapibus ut amet.",
  "Labore voluptate ut tortor reprehenderit nec. Velit non quam anim, aliquip exercitation pretium magna eiusmod nunc. Dolor eget aliquam commodo, do nisi amet sunt fringilla magnis. Pretium sit mauris nascetur vulputate, morbi sapien pulvinar quam. Ad congue a enim dolore montes placerat turpis."
 ],
 "text": "Lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor incididunt. Nisl habitant odio aliquam in ex, placerat montes veniam faucibus elementum sit. Pharetra varius elit quis faucibus elementum cupidatat vitae faucibus eu volutpat incididunt habitant. Sapien fames vestibulum tortor, elit pulvinar officia irure eu consectetur. Ultricies exercitation nostrud nunc occaecat anim fugiat proin aliquam sit pellentesque lectus. Erat fames amet ultricies habitant lacinia nulla erat ex exercitation dapibus ut amet.\n\nLabore voluptate ut tortor reprehenderit nec. Velit non quam anim, aliquip exercitation pretium magna eiusmod nunc. Dolor eget aliquam commodo, do nisi amet sunt fringilla magnis. Pretium sit mauris nascetur vulputate, morbi sapien pulvinar quam. Ad congue a enim dolore montes placerat turpis.",
 "stats": {
  "paragraphs": 2,
  "sentences": 11,
  "words": 116,
  "chars": 827
 },
 "seed": "42"
}

Code examples

curl
curl 'https://api.oddlathe.com/v1/lorem?paragraphs=2&seed=42'
JavaScript (browser or Node 18+)
const params = new URLSearchParams({
  paragraphs: "2",
  seed: "42"
});
const res = await fetch(`https://api.oddlathe.com/v1/lorem?${params}`);
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();
console.log(data);
Python (standard library only)
import json, urllib.parse, urllib.request

params = urllib.parse.urlencode({"paragraphs": "2", "seed": "42"})
url = "https://api.oddlathe.com/v1/lorem?" + params
# Send a User-Agent: the edge network refuses Python's default one.
req = urllib.request.Request(url, headers={"User-Agent": "my-script/1.0"})
with urllib.request.urlopen(req, timeout=10) as r:
    data = json.load(r)
print(data)

When it's useful

  • Mock-ups and design comps that need realistic-looking body copy
  • CI fixtures and screenshot tests that must stay bit-stable across runs
  • Scaffolding a blog or CMS page before the real copy arrives
  • Teaching the difference between words, sentences and paragraphs as units

Good to know

  • Pass exactly one of paragraphs (1–20), sentences (1–100) or words (1–500). If several are set, paragraphs wins, then sentences, then words. With none set, you get 3 paragraphs.
  • start (default true) begins the first paragraph with the classic Lorem ipsum dolor sit amet… opener. Set start=false for plain randomised filler.
  • html=1 also returns an html field with each paragraph wrapped in <p> tags. text and paragraphs are always present.
  • seed makes the sample repeatable. Integers are used directly; any other short string is hashed (SHA-256) to a 32-bit seed. The same seed produces the same text in Anvil and in the Tooltern browser tool.
  • Pure generation on the query string; nothing is stored or fetched. Output is capped by the count limits above.
  • Browser UI: Tooltern lorem ipsum generator (same generator, nothing leaves your device).

Placeholder text for mock-ups and fixtures. Ask for paragraphs, sentences or words; optionally start with the classic Lorem ipsum opener, wrap in HTML <p> tags, and pass a seed for a repeatable sample. Pure generation; nothing is stored.

Errors

Errors are JSON like {"error": {"code": "…", "message": "…"}}. The ones this endpoint can return:

  • bad_param (400): a value is the wrong type or out of range (the message says which)
  • rate_limited (429): over 60 requests a minute; wait for Retry-After seconds

Questions

Is this real Latin?

No. It is the traditional typesetting placeholder that looks like Latin so layout is easier to judge without reading the words.

Will the same seed match the browser tool?

Yes for integer seeds, and for string seeds once both sides hash with SHA-256 (the Tooltern page does).

Is anything stored?

Never. Generation only; no logs of the text.

Related endpoints

Prefer a page to an API?

Published · OpenAPI 3.1 spec · Limits and privacy