Rich Text Format
How biographies and descriptions are encoded (Fleather / Parchment Delta).
Rich-text fields - such as a speaker’s biography - are stored as a Fleather / Parchment Delta, serialized as a JSON string. This is a Quill-compatible Delta: an array of ops, where each op has an insert (the text) and optional attributes (the formatting on that run).
Attributes use short keys (for example b for bold). Use the short keys listed below when you send rich text through the API.
[
{ "insert": "About Jane" },
{ "insert": "\n", "attributes": { "heading": 2 } },
{ "insert": "Jane is a " },
{ "insert": "keynote speaker", "attributes": { "b": true } },
{ "insert": " - see her ", "attributes": {} },
{ "insert": "profile", "attributes": { "a": "https://example.com" } },
{ "insert": ".\n" }
]
Attributes
Attributes are attached to the text run they format (inline styles) or, for block styles, to the newline (\n) that ends the line.
| Key | Type | Kind | Meaning |
|---|---|---|---|
b |
boolean | inline | Bold |
i |
boolean | inline | Italic |
u |
boolean | inline | Underline |
s |
boolean | inline | Strikethrough |
a |
string | inline | Link - the value is the URL |
fg |
integer | inline | Text colour, as a 32-bit ARGB integer (e.g. 0xFFCC0000) |
alignment |
string | block | left / right / center / justify |
heading |
integer | block | Heading level 1-6 (see below) |
block |
string | block | ul (bullet list) or ol (ordered list); attach to each line’s trailing \n |
Plain strings are also accepted - a field that is not valid Delta JSON is treated as plain text - but it will render without any formatting. An empty Delta ([] or one containing only newlines) is treated as empty.
You can also send the ops as a real JSON array, rather than a string containing one:
{"biography": [{"insert": "Jane Doe"}, {"insert": "\n", "attributes": {"heading": 2}}]}
This is usually the easier form - it saves you serializing a value you are about to embed in a JSON body anyway, and it is one fewer place to get the escaping wrong. Both forms mean exactly the same thing. Reads always return the string form, because that is how it is stored.
Heading levels
Headings use the heading attribute (values 1-6) on the line’s trailing newline. Event Vault gives the levels distinct visual roles rather than a plain descending scale:
| Level | Renders as |
|---|---|
1 |
Heading (largest) |
2 |
Heading |
3 |
Heading |
4 |
Heading at body-text size - a subtle heading, same size as normal text |
5 |
Grey sub-text - muted secondary line |
6 |
Red warning text - a callout, sized between heading 2 and heading 3 |
Example with block styles
[
{ "insert": "Heads up: schedule is provisional" },
{ "insert": "\n", "attributes": { "heading": 6 } },
{ "insert": "Focus areas" },
{ "insert": "\n", "attributes": { "heading": 5 } },
{ "insert": "Machine learning" },
{ "insert": "\n", "attributes": { "block": "ul" } },
{ "insert": "Robotics" },
{ "insert": "\n", "attributes": { "block": "ul" } }
]
This is the same format used by the in-app profile and the console editor, so content you send through the API is rendered wherever the field appears in Event Vault.