{"id":"font-convert","title":"Font converter: TTF/OTF, WOFF and WOFF2 containers, with the font's own embedding permission checked","description":"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.","roi":"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.","audience":"business","package":"identifier-text-kit","channels":["x402","mcp"],"endpoint":{"method":"POST","url":"https://agents.writerslogic.com/api/v1/font-convert","path":"/api/v1/font-convert","contentType":"application/json"},"price":{"amount":"0.01","currency":"USDC","network":"base","perCall":true,"failedCallsCharged":false},"inputSchema":{"type":"object","additionalProperties":false,"required":["fontBase64","to"],"properties":{"fontBase64":{"type":"string","minLength":8,"maxLength":2796204,"description":"Base64 of a .ttf, .otf, .woff or .woff2 file (not a .ttc collection), up to 2 MB."},"to":{"type":"string","enum":["sfnt","woff","woff2"],"description":"Target container. sfnt is the plain .ttf/.otf file."}}},"resultSchema":{"type":"object","properties":{"status":{"type":"string","enum":["pass","fail","unknown","unsupported"],"description":"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":{"anyOf":[{"type":"string","enum":["ttf/otf","woff","woff2"]},{"type":"null"}]},"outline":{"anyOf":[{"type":"string","enum":["truetype","cff","other"],"description":"Outline flavor of the sfnt inside the container; this tool never changes it."},{"type":"null"}]},"targetFormat":{"type":"string","enum":["ttf/otf","woff","woff2"]},"fontBase64":{"anyOf":[{"type":"string","description":"The converted font; null when the licence check failed or the input could not be read."},{"type":"null"}]},"bytes":{"anyOf":[{"type":"integer"},{"type":"null"}]},"sha256":{"anyOf":[{"type":"string","description":"SHA-256 of the converted file."},{"type":"null"}]},"fontDigest":{"anyOf":[{"type":"string","description":"SHA-256 over every table's tag and content digest (head.checkSumAdjustment zeroed). Identical for a font in any container, so it proves that only the container changed."},{"type":"null"}]},"tables":{"type":"array","items":{"type":"string"}},"family":{"anyOf":[{"type":"string"},{"type":"null"}]},"licence":{"anyOf":[{"type":"object","description":"What the font file itself declares about embedding (OS/2 fsType and name IDs 13/14). A declaration in the file, not legal advice and not a licence.","properties":{"declared":{"type":"boolean","description":"False when the font has no OS/2 table, so no embedding permission is declared."},"fsType":{"anyOf":[{"type":"integer"},{"type":"null"}]},"restricted":{"type":"boolean","description":"fsType bit 0x0002: the vendor forbids embedding."},"previewPrintOnly":{"type":"boolean","description":"fsType permission 0x0004 alone: preview and print embedding only."},"ambiguous":{"type":"boolean","description":"Conflicting permission bits (for example restricted with another bit set) or the deprecated bit 0; the OS/2 specification does not give one answer."},"noSubsetting":{"type":"boolean"},"bitmapOnly":{"type":"boolean"},"license":{"anyOf":[{"type":"string","description":"name ID 13"},{"type":"null"}]},"licenseUrl":{"anyOf":[{"type":"string","description":"name ID 14"},{"type":"null"}]}}},{"type":"null"}]},"witnesses":{"type":"array","items":{"type":"object","properties":{"ruleId":{"type":"string"},"detail":{"type":"string"},"path":{"type":"string","description":"JSON pointer or dotted path into the input."},"offset":{"type":"integer"},"index":{"type":"integer"},"expected":{"description":"What the rule required."},"actual":{"description":"What the input had."}}}},"versions":{"type":"object","description":"Every semantic dependency of this answer (engine, tables and their as-of dates, tokenizer, calendar, rounding profile)."},"limits":{"type":"array","items":{"type":"string"}},"deterministic":{"type":"boolean","description":"Always true: pure code, no model."}}},"outputSchema":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"type":"string","enum":["pass","fail","unknown","unsupported"],"description":"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":{"anyOf":[{"type":"string","enum":["ttf/otf","woff","woff2"]},{"type":"null"}]},"outline":{"anyOf":[{"type":"string","enum":["truetype","cff","other"],"description":"Outline flavor of the sfnt inside the container; this tool never changes it."},{"type":"null"}]},"targetFormat":{"type":"string","enum":["ttf/otf","woff","woff2"]},"fontBase64":{"anyOf":[{"type":"string","description":"The converted font; null when the licence check failed or the input could not be read."},{"type":"null"}]},"bytes":{"anyOf":[{"type":"integer"},{"type":"null"}]},"sha256":{"anyOf":[{"type":"string","description":"SHA-256 of the converted file."},{"type":"null"}]},"fontDigest":{"anyOf":[{"type":"string","description":"SHA-256 over every table's tag and content digest (head.checkSumAdjustment zeroed). Identical for a font in any container, so it proves that only the container changed."},{"type":"null"}]},"tables":{"type":"array","items":{"type":"string"}},"family":{"anyOf":[{"type":"string"},{"type":"null"}]},"licence":{"anyOf":[{"type":"object","description":"What the font file itself declares about embedding (OS/2 fsType and name IDs 13/14). A declaration in the file, not legal advice and not a licence.","properties":{"declared":{"type":"boolean","description":"False when the font has no OS/2 table, so no embedding permission is declared."},"fsType":{"anyOf":[{"type":"integer"},{"type":"null"}]},"restricted":{"type":"boolean","description":"fsType bit 0x0002: the vendor forbids embedding."},"previewPrintOnly":{"type":"boolean","description":"fsType permission 0x0004 alone: preview and print embedding only."},"ambiguous":{"type":"boolean","description":"Conflicting permission bits (for example restricted with another bit set) or the deprecated bit 0; the OS/2 specification does not give one answer."},"noSubsetting":{"type":"boolean"},"bitmapOnly":{"type":"boolean"},"license":{"anyOf":[{"type":"string","description":"name ID 13"},{"type":"null"}]},"licenseUrl":{"anyOf":[{"type":"string","description":"name ID 14"},{"type":"null"}]}}},{"type":"null"}]},"witnesses":{"type":"array","items":{"type":"object","properties":{"ruleId":{"type":"string"},"detail":{"type":"string"},"path":{"type":"string","description":"JSON pointer or dotted path into the input."},"offset":{"type":"integer"},"index":{"type":"integer"},"expected":{"description":"What the rule required."},"actual":{"description":"What the input had."}}}},"versions":{"type":"object","description":"Every semantic dependency of this answer (engine, tables and their as-of dates, tokenizer, calendar, rounding profile)."},"limits":{"type":"array","items":{"type":"string"}},"deterministic":{"type":"boolean","description":"Always true: pure code, no model."}}},"_provenance":{"type":"object","description":"C2PA-aligned manifest and W3C VC 2.0 (eddsa-jcs-2022) issued by the hub DID; verify at POST /api/v1/verify-provenance"}},"required":["data","_provenance"]},"example":{"fontBase64":"AAEAAAAJAAAAAAAAT1MvMgAAAAAAAACcAAAAYGNtYXAAAAAAAAAA/AAAADxnbHlmAAAAAAAAATgAAACEaGVhZAAAAAAAAAG8AAAANmhoZWEAAAAAAAAB9AAAACRobXR4AAAAAAAAAhgAAAAUbG9jYQAAAAAAAAIsAAAADG1heHAAAAAAAAACOAAAACBuYW1lAAAAAAAAAlgAAAEyAAQCWAGQAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQADAAEAAAAMAAQAMAAAAAgAAAAAAAAAQQBCAOn//wAAAEEAQgDp////wP/A/xsAAQAAAAAAAAAAAAEAZAAAA4QCvAACAAABAQEAZAGQAZAAAAK8/UQAAAAAAQAAAAADIAK8AAQAAAEBAAEAAAAAAAHCAV7+ogAAArwAAP6i/qIAAAEAAAAAAMgAZAACAAABAQEAAABkAGQAAABk/5wAAAD//wBkAAAETAMgACMAAQAAAAAAAwADAMgCvAAAAAEAAAABAAAAAAAAXw889QAAA+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAyD/OABaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUB9AAAA+gAAAMgAAABLAAAA+gAAAAAAAAAEAAkADQAQgABAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgBOAAMAAQQJAAEAFAAAAAMAAQQJAAIADgAUAAMAAQQJAAQAJAAiAAMAAQQJAAYAIgBGAAMAAQQJAA0ARgBoAAMAAQQJAA4ANgCuAFMAeQBuAHQAaAAgAFMAYQBuAHMAUgBlAGcAdQBsAGEAcgBTAHkAbgB0AGgAIABTAGEAbgBzACAAUgBlAGcAdQBsAGEAcgBTAHkAbgB0AGgAUwBhAG4AcwAtAFIAZQBnAHUAbABhAHIAUwB5AG4AdABoAGUAdABpAGMAIAB0AGUAcwB0ACAAZgBvAG4AdAAsACAAcAB1AGIAbABpAGMAIABkAG8AbQBhAGkAbgAuAGgAdAB0AHAAcwA6AC8ALwBlAHgAYQBtAHAAbABlAC4AYwBvAG0ALwBsAGkAYwBlAG4AcwBlAAA=","to":"woff2"},"openapiOperation":{"operationId":"font_convert","summary":"Font converter: TTF/OTF, WOFF and WOFF2 containers, with the font's own embedding permission checked","description":"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.\n\nPrice: 0.01 USDC on Base (x402).","x-x402-price-usdc":"0.01","x-x402-amount":"10000","x-payment-info":{"protocols":["x402"],"price":{"mode":"fixed","currency":"USD","amount":"0.01"}},"x-audience":"business","x-sample-url":"https://agents.writerslogic.com/api/v1/samples/font-convert","security":[{"x402":[]},{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["fontBase64","to"],"properties":{"fontBase64":{"type":"string","minLength":8,"maxLength":2796204,"description":"Base64 of a .ttf, .otf, .woff or .woff2 file (not a .ttc collection), up to 2 MB."},"to":{"type":"string","enum":["sfnt","woff","woff2"],"description":"Target container. sfnt is the plain .ttf/.otf file."}}},"example":{"fontBase64":"AAEAAAAJAAAAAAAAT1MvMgAAAAAAAACcAAAAYGNtYXAAAAAAAAAA/AAAADxnbHlmAAAAAAAAATgAAACEaGVhZAAAAAAAAAG8AAAANmhoZWEAAAAAAAAB9AAAACRobXR4AAAAAAAAAhgAAAAUbG9jYQAAAAAAAAIsAAAADG1heHAAAAAAAAACOAAAACBuYW1lAAAAAAAAAlgAAAEyAAQCWAGQAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQADAAEAAAAMAAQAMAAAAAgAAAAAAAAAQQBCAOn//wAAAEEAQgDp////wP/A/xsAAQAAAAAAAAAAAAEAZAAAA4QCvAACAAABAQEAZAGQAZAAAAK8/UQAAAAAAQAAAAADIAK8AAQAAAEBAAEAAAAAAAHCAV7+ogAAArwAAP6i/qIAAAEAAAAAAMgAZAACAAABAQEAAABkAGQAAABk/5wAAAD//wBkAAAETAMgACMAAQAAAAAAAwADAMgCvAAAAAEAAAABAAAAAAAAXw889QAAA+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAyD/OABaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUB9AAAA+gAAAMgAAABLAAAA+gAAAAAAAAAEAAkADQAQgABAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgBOAAMAAQQJAAEAFAAAAAMAAQQJAAIADgAUAAMAAQQJAAQAJAAiAAMAAQQJAAYAIgBGAAMAAQQJAA0ARgBoAAMAAQQJAA4ANgCuAFMAeQBuAHQAaAAgAFMAYQBuAHMAUgBlAGcAdQBsAGEAcgBTAHkAbgB0AGgAIABTAGEAbgBzACAAUgBlAGcAdQBsAGEAcgBTAHkAbgB0AGgAUwBhAG4AcwAtAFIAZQBnAHUAbABhAHIAUwB5AG4AdABoAGUAdABpAGMAIAB0AGUAcwB0ACAAZgBvAG4AdAAsACAAcAB1AGIAbABpAGMAIABkAG8AbQBhAGkAbgAuAGgAdAB0AHAAcwA6AC8ALwBlAHgAYQBtAHAAbABlAC4AYwBvAG0ALwBsAGkAYwBlAG4AcwBlAAA=","to":"woff2"}}}},"responses":{"200":{"description":"Paid result with provenance","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"type":"string","enum":["pass","fail","unknown","unsupported"],"description":"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":{"anyOf":[{"type":"string","enum":["ttf/otf","woff","woff2"]},{"type":"null"}]},"outline":{"anyOf":[{"type":"string","enum":["truetype","cff","other"],"description":"Outline flavor of the sfnt inside the container; this tool never changes it."},{"type":"null"}]},"targetFormat":{"type":"string","enum":["ttf/otf","woff","woff2"]},"fontBase64":{"anyOf":[{"type":"string","description":"The converted font; null when the licence check failed or the input could not be read."},{"type":"null"}]},"bytes":{"anyOf":[{"type":"integer"},{"type":"null"}]},"sha256":{"anyOf":[{"type":"string","description":"SHA-256 of the converted file."},{"type":"null"}]},"fontDigest":{"anyOf":[{"type":"string","description":"SHA-256 over every table's tag and content digest (head.checkSumAdjustment zeroed). Identical for a font in any container, so it proves that only the container changed."},{"type":"null"}]},"tables":{"type":"array","items":{"type":"string"}},"family":{"anyOf":[{"type":"string"},{"type":"null"}]},"licence":{"anyOf":[{"type":"object","description":"What the font file itself declares about embedding (OS/2 fsType and name IDs 13/14). A declaration in the file, not legal advice and not a licence.","properties":{"declared":{"type":"boolean","description":"False when the font has no OS/2 table, so no embedding permission is declared."},"fsType":{"anyOf":[{"type":"integer"},{"type":"null"}]},"restricted":{"type":"boolean","description":"fsType bit 0x0002: the vendor forbids embedding."},"previewPrintOnly":{"type":"boolean","description":"fsType permission 0x0004 alone: preview and print embedding only."},"ambiguous":{"type":"boolean","description":"Conflicting permission bits (for example restricted with another bit set) or the deprecated bit 0; the OS/2 specification does not give one answer."},"noSubsetting":{"type":"boolean"},"bitmapOnly":{"type":"boolean"},"license":{"anyOf":[{"type":"string","description":"name ID 13"},{"type":"null"}]},"licenseUrl":{"anyOf":[{"type":"string","description":"name ID 14"},{"type":"null"}]}}},{"type":"null"}]},"witnesses":{"type":"array","items":{"type":"object","properties":{"ruleId":{"type":"string"},"detail":{"type":"string"},"path":{"type":"string","description":"JSON pointer or dotted path into the input."},"offset":{"type":"integer"},"index":{"type":"integer"},"expected":{"description":"What the rule required."},"actual":{"description":"What the input had."}}}},"versions":{"type":"object","description":"Every semantic dependency of this answer (engine, tables and their as-of dates, tokenizer, calendar, rounding profile)."},"limits":{"type":"array","items":{"type":"string"}},"deterministic":{"type":"boolean","description":"Always true: pure code, no model."}}},"_provenance":{"type":"object","description":"C2PA-aligned manifest and W3C VC 2.0 (eddsa-jcs-2022) issued by the hub DID; verify at POST /api/v1/verify-provenance"}},"required":["data","_provenance"]}}}},"400":{"description":"Invalid request (no payment consumed)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"401":{"description":"Invalid X-API-KEY","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"402":{"description":"Payment required or invalid","content":{"application/json":{"schema":{"type":"object","description":"x402 v2 PaymentRequired (also base64 in the PAYMENT-REQUIRED header)","properties":{"x402Version":{"type":"integer"},"error":{"type":"string"},"code":{"type":"string"},"resource":{"type":"object"},"accepts":{"type":"array","items":{"type":"object"}},"extensions":{"type":"object"}}}}}},"502":{"description":"Upstream failure; the payment is released or not settled","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}},"links":{"docs":"https://agents.writerslogic.com/docs/font-convert/","docsJson":"https://agents.writerslogic.com/docs/font-convert.json","sample":"https://agents.writerslogic.com/api/v1/samples/font-convert","openapi":"https://agents.writerslogic.com/openapi.json","catalog":"https://agents.writerslogic.com/api/v1/catalog","verifyProvenance":"https://agents.writerslogic.com/api/v1/verify-provenance","index":"https://agents.writerslogic.com/docs/index.json"}}