Font converter: TTF/OTF, WOFF and WOFF2 containers, with the font's own embedding permission checked
Repackages a font you supply as base64 (up to 2 MB) between the sfnt (.ttf/.otf), WOFF and WOFF2 containers, for an agent or build step that needs a web font in a particular format: every table is carried over unchanged, the result is read back and its table digest compared with the source, and the font's own OS/2 embedding bits are checked first (a restricted font fails and nothing is returned). It does not convert outlines (TrueType to CFF or back), subset, hint, optimise or rename a font, does not read font collections (.ttc), and a declared embedding permission is not legal advice. WOFF2 output is not size-optimal: glyf, loca and hmtx are stored untransformed.
What you get
Gets a font into WOFF2 or back to TTF without installing fontTools or brotli, and refuses a font whose vendor forbids embedding before it ships on a site.
Call it
Send the JSON body below to https://agents.writerslogic.com/api/v1/font-convert. An unpaid request answers 402 with the price and how to pay; a request that fails with a 5xx status is not charged.
curl -i -X POST https://agents.writerslogic.com/api/v1/font-convert \
-H 'content-type: application/json' \
-d '{"fontBase64":"AAEAAAAJAAAAAAAAT1MvMgAAAAAAAACcAAAAYGNtYXAAAAAAAAAA/AAAADxnbHlmAAAAAAAAATgAAACEaGVhZAAAAAAAAAG8AAAANmhoZWEAAAAAAAAB9AAAACRobXR4AAAAAAAAAhgAAAAUbG9jYQAAAAAAAAIsAAAADG1heHAAAAAAAAACOAAAACBuYW1lAAAAAAAAAlgAAAEyAAQCWAGQAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQADAAEAAAAMAAQAMAAAAAgAAAAAAAAAQQBCAOn//wAAAEEAQgDp////wP/A/xsAAQAAAAAAAAAAAAEAZAAAA4QCvAACAAABAQEAZAGQAZAAAAK8/UQAAAAAAQAAAAADIAK8AAQAAAEBAAEAAAAAAAHCAV7+ogAAArwAAP6i/qIAAAEAAAAAAMgAZAACAAABAQEAAABkAGQAAABk/5wAAAD//wBkAAAETAMgACMAAQAAAAAAAwADAMgCvAAAAAEAAAABAAAAAAAAXw889QAAA+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAyD/OABaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUB9AAAA+gAAAMgAAABLAAAA+gAAAAAAAAAEAAkADQAQgABAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgBOAAMAAQQJAAEAFAAAAAMAAQQJAAIADgAUAAMAAQQJAAQAJAAiAAMAAQQJAAYAIgBGAAMAAQQJAA0ARgBoAAMAAQQJAA4ANgCuAFMAeQBuAHQAaAAgAFMAYQBuAHMAUgBlAGcAdQBsAGEAcgBTAHkAbgB0AGgAIABTAGEAbgBzACAAUgBlAGcAdQBsAGEAcgBTAHkAbgB0AGgAUwBhAG4AcwAtAFIAZQBnAHUAbABhAHIAUwB5AG4AdABoAGUAdABpAGMAIAB0AGUAcwB0ACAAZgBvAG4AdAAsACAAcAB1AGIAbABpAGMAIABkAG8AbQBhAGkAbgAuAGgAdAB0AHAAcwA6AC8ALwBlAHgAYQBtAHAAbABlAC4AYwBvAG0ALwBsAGkAYwBlAG4AcwBlAAA=","to":"woff2"}'
Input
| Field | Type | Required | Description |
|---|---|---|---|
fontBase64 | string; length 8..2796204 | yes | Base64 of a .ttf, .otf, .woff or .woff2 file (not a .ttc collection), up to 2 MB. |
to | string; one of "sfnt", "woff", "woff2" | yes | Target container. sfnt is the plain .ttf/.otf file. |
Example request body
{
"fontBase64": "AAEAAAAJAAAAAAAAT1MvMgAAAAAAAACcAAAAYGNtYXAAAAAAAAAA/AAAADxnbHlmAAAAAAAAATgAAACEaGVhZAAAAAAAAAG8AAAANmhoZWEAAAAAAAAB9AAAACRobXR4AAAAAAAAAhgAAAAUbG9jYQAAAAAAAAIsAAAADG1heHAAAAAAAAACOAAAACBuYW1lAAAAAAAAAlgAAAEyAAQCWAGQAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQADAAEAAAAMAAQAMAAAAAgAAAAAAAAAQQBCAOn//wAAAEEAQgDp////wP/A/xsAAQAAAAAAAAAAAAEAZAAAA4QCvAACAAABAQEAZAGQAZAAAAK8/UQAAAAAAQAAAAADIAK8AAQAAAEBAAEAAAAAAAHCAV7+ogAAArwAAP6i/qIAAAEAAAAAAMgAZAACAAABAQEAAABkAGQAAABk/5wAAAD//wBkAAAETAMgACMAAQAAAAAAAwADAMgCvAAAAAEAAAABAAAAAAAAXw889QAAA+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAyD/OABaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUB9AAAA+gAAAMgAAABLAAAA+gAAAAAAAAAEAAkADQAQgABAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgBOAAMAAQQJAAEAFAAAAAMAAQQJAAIADgAUAAMAAQQJAAQAJAAiAAMAAQQJAAYAIgBGAAMAAQQJAA0ARgBoAAMAAQQJAA4ANgCuAFMAeQBuAHQAaAAgAFMAYQBuAHMAUgBlAGcAdQBsAGEAcgBTAHkAbgB0AGgAIABTAGEAbgBzACAAUgBlAGcAdQBsAGEAcgBTAHkAbgB0AGgAUwBhAG4AcwAtAFIAZQBnAHUAbABhAHIAUwB5AG4AdABoAGUAdABpAGMAIAB0AGUAcwB0ACAAZgBvAG4AdAAsACAAcAB1AGIAbABpAGMAIABkAG8AbQBhAGkAbgAuAGgAdAB0AHAAcwA6AC8ALwBlAHgAYQBtAHAAbABlAC4AYwBvAG0ALwBsAGkAYwBlAG4AcwBlAAA=",
"to": "woff2"
}
Result
The response is { "data": ..., "_provenance": ... }. data carries these fields; _provenance is a signed W3C Verifiable Credential with a C2PA-style manifest, checked free at POST /api/v1/verify-provenance.
| Field | Type | Required | Description |
|---|---|---|---|
status | string; one of "pass", "fail", "unknown", "unsupported" | no | pass: every rule held. fail: a rule was violated (see witnesses). unknown: the input lacks the evidence to decide. unsupported: outside what this engine covers. Missing evidence is never a pass. |
sourceFormat | one of | no | |
outline | one of | no | |
targetFormat | string; one of "ttf/otf", "woff", "woff2" | no | |
fontBase64 | one of | no | |
bytes | one of | no | |
sha256 | one of | no | |
fontDigest | one of | no | |
tables | array<string> | no | |
family | one of | no | |
licence | one of | no | |
witnesses | array<object> | no | |
versions | object | no | Every semantic dependency of this answer (engine, tables and their as-of dates, tokenizer, calendar, rounding profile). |
limits | array<string> | no | |
deterministic | boolean | no | Always true: pure code, no model. |
Pay and connect
Available through: x402 (USDC on Base), MCP. MCP clients reach it through the identifier-text-kit package.
Machine-readable
- This agent as JSON (schemas, example, OpenAPI operation)
- Free signed sample response
- OpenAPI 3.1 · Catalog · Index of every agent