AODM 1.3 complete package
Specification, XML Schema, JSON Schema, validation rules, HTML embedding profile, worked examples, conformance test suite, reference parsers in 4 languages, graph compiler, inference engine, LLM context builder, converters from XBRL, spreadsheets and CMS exports, Schema.org JSON-LD and product feeds, and Python readers for LangChain, LlamaIndex and MCP.
aodm-1.3.zip · 191 KB
What’s in the package
| File | Purpose |
|---|---|
AODM-1.3-SPECIFICATION.md | The authoritative specification |
aodm-core-1.3.xsd | XML Schema for the 1.3 core |
aodm-core-1.3.schema.json | JSON Schema equivalent |
VALIDATION-RULES.md | Rules a conformant processor must enforce beyond schema validation |
AODM-1.3-HTML-PROFILE.md | The HTML Embedding Profile — marking up web pages with a data-aodm attribute |
example-core-1.3.xml / .json | Worked examples using every feature |
conformance-check.py | Test suite verifying the schemas accept valid and reject invalid documents |
parsers/python/, parsers/javascript/,parsers/java/, parsers/csharp/ | Reference parsers — read, validate and write AODM. See Tools |
parsers/conformance.py | Cross-language suite requiring all four parsers to agree |
converters/xbrl_to_aodm.py | XBRL 2.1 instance documents to AODM, named with the filer’s own labels when you pass its label file |
converters/sheet_to_aodm.py | Spreadsheets and CMS exports (CSV, TSV, XLSX) to AODM |
converters/jsonld_to_aodm.py | Schema.org JSON-LD, from a page or a file, to AODM |
converters/feed_to_aodm.py | Product feeds (Google Merchant Center RSS, Atom, CSV, TSV) to AODM |
converters/aodm_defaults.py | Writes and expands page-level defaults in tagged pages |
converters/samples/, converters/test_*.py | Sample inputs and tests for every converter |
graph/aodm_graph.py | Graph compiler — Cypher, RDF Turtle, GraphML, Graphviz |
graph/reasoner.py | Inference engine — evaluates rules per the specification’s inference section, with explanation and retraction |
llm/context.py | Renders AODM into prompt-ready context for any language model |
integrations/aodm-reader/ | Python reader: tagged pages and AODM JSON as search passages that keep their facts |
integrations/langchain-aodm/,integrations/llama-index-readers-aodm/ | LangChain loader and retriever, and LlamaIndex reader, built on the reader |
integrations/aodm-mcp/ | MCP server that lets an AI model search your tagged pages |
reference/aodm-validator-1.3.jsreference/aodm-html-extract.js | Browser validator and HTML-profile extractor |
LICENSE, NOTICE | Apache License 2.0 |
Getting started
Ways to carry AODM, from a file of its own to attributes on pages you already publish, then how to convert existing data and read it in AI pipelines.
1. A standalone document
A file of its own — knowledge.xml. Declare the
namespace on the root element.
<?xml version="1.0" encoding="UTF-8"?>
<aodm:knowledge version="1.3" xmlns:aodm="http://fucaspark.com/aodm/1.3">
<aodm:entity id="engine" type="component" label="Engine"/>
<aodm:fact id="temp-rise" about="engine" valid-from="2026-01-15">
Temperature rise under sustained load.
<aodm:value number="1.2" unit="Cel" tolerance="0.1"/>
<aodm:source uri="https://example.com/report-24" retrieved="2026-01-15"/>
<aodm:confidence value="0.9"/>
</aodm:fact>
</aodm:knowledge>
2. The same document as JSON
A file of its own — knowledge.json. No namespace;
aodm_version identifies the format. XML attributes are hyphenated,
their JSON counterparts snake_cased.
{
"aodm_version": "1.3",
"entities": [
{ "id": "engine", "type": "component", "label": "Engine" }
],
"facts": [
{
"id": "temp-rise",
"about": "engine",
"statement": "Temperature rise under sustained load.",
"value": { "number": 1.2, "unit": "Cel", "tolerance": 0.1 },
"valid_from": "2026-01-15",
"source": { "uri": "https://example.com/report-24", "retrieved": "2026-01-15" },
"confidence": 0.9
}
]
}
3. Embedded in a page you already publish
Inside your existing HTML, on the element that already displays the content. Nothing new to render, no script to load.
<p data-aodm='{"fact":"temp-rise","about":"engine","valid_from":"2026-01-15",
"value":{"number":1.2,"unit":"Cel","tolerance":0.1},
"source":"https://example.com/report-24","confidence":0.9}'>
Temperature rise under sustained load: 1.2 °C.
</p>
Keys are the same field names as the JSON document above. The attribute is
single-quoted because JSON uses double quotes inside.
source accepts a bare URI, confidence a bare number.
One attribute per value is also valid, and both forms may be mixed:
<p data-aodm="fact" data-aodm-id="temp-rise" data-aodm-about="engine"
data-aodm-valid-from="2026-01-15" data-aodm-number="1.2" data-aodm-unit="Cel"
data-aodm-tolerance="0.1" data-aodm-confidence="0.9">
Facts written inside an element marked entity inherit its id, so
about can be left off entirely.
Since 1.3, values every fact on a page shares can be declared once, on the
body or any element around the facts:
<body data-aodm-defaults='{"source":{"uri":"https://example.com/report-24",
"asserted":"2026-02-28"},"valid_from":"2025-01-01"}'>
Readers copy them into each compact-form fact inside, unless the fact sets its own.
converters/aodm_defaults.py compact page.html writes them for you.
4. Check it
Before you publish.
- Validate a standalone document against
aodm-core-1.3.xsdoraodm-core-1.3.schema.json, then apply the rules inVALIDATION-RULES.md. - Paste either form into the online validator, which also extracts embedded AODM straight from a page.
- Every element and attribute is defined in the documentation.
5. Convert what you already have
Unpack the zip and run a converter from its top folder. Each one prints AODM JSON,
and --validate checks the result.
python3 converters/sheet_to_aodm.py products.csv --validate
python3 converters/jsonld_to_aodm.py page.html --validate
python3 converters/feed_to_aodm.py feed.xml --currency=USD --validate
More options for each one are on the Tools page.
6. Use it in RAG pipelines and AI agents
The Python readers ship in the zip as source. Install them with pip from its top folder; nothing is fetched from PyPI apart from their dependencies.
pip install ./integrations/aodm-reader ./integrations/langchain-aodm
Examples for LangChain, LlamaIndex and MCP are on the Tools page.
FucaSpark AODM for WordPress 1.0.0 — WordPress plugin. Sends a site's published pages to the FucaSpark account that bought AODM tagging, and links the two with an approval code. Requires WordPress 5.6 and PHP 7.4. GPLv2 or later.
Source
Everything in the package is also on GitHub, where you can read it, file an issue or send a change: https://github.com/FucaSpark/aodm.
Sending pages from WordPress
If your site is public we read it ourselves and you need do nothing. Use the plugin when the site sits behind a login, or when you would rather we did not crawl it.
- Download the WordPress plugin: https://fucaspark.com/dl.php?f=fucaspark-aodm-wp
- In WordPress: Plugins, Add New, Upload Plugin. Choose the zip, Install Now, then Activate.
- Go to Tools, FucaSpark AODM.
- Enter the email address you paid with and click "Email me a link".
- Open that email and approve the request. Check the code in the email matches the one on the plugin screen.
- Back in WordPress, click "Check now". The screen will say the site is linked.
- Tick the pages you want marked up.
- Click "Send pages to FucaSpark".
License
AODM is released under the Apache License, Version 2.0. You are free to use, modify and distribute it, including commercially, and to build your own implementations of the specification.
Apache 2.0 includes an express patent grant. The full text ships as
LICENSE in the download, alongside NOTICE.
Copyright © 2026 FucaSpark.
Told when it updates
This is AODM 1.3. Leave an address and we email you when the specification, the schemas or the conformance suite are revised — and at no other time.
One confirmation email first. Unsubscribe from any message. See privacy.