The internet, readable by agents.

Manifest turns any URL into a structured map of what an AI agent can actually do on a page - every button, form, and input, with the fields it needs to fill and what's required before it can move on.

For developers building browser agents

Try Manifest live

https://omfang.io/contact

The problem

Give an AI agent a browser, and it can see a webpage. Give it a scraper, and it can read one. Neither tells it what it's allowed to do there.

Today, agents either take a screenshot and guess, or a developer hand-writes selectors that break the next time the page ships a redesign. There's no layer that tells an agent: here are the actions on this page, here's what each one needs, here's what's required.

That's the gap Manifest fills.

How it works

Manifest visits a URL, reads its accessibility tree the same way a screen reader would, and cross-references it against the page's actual DOM for the details accessibility trees miss — required fields, input types, placeholders, disabled states. That combined picture is translated into a clean JSON action manifest: every button, form, and input on the page, described in terms an agent can reason about and act on.

Manifest visits a URL, reads its accessibility tree the same way a screen reader would, and cross-references it against the page's actual DOM for the details accessibility trees miss — required fields, input types, placeholders, disabled states. That combined picture is translated into a clean JSON action manifest: every button, form, and input on the page, described in terms an agent can reason about and act on.

URL → accessibility tree → DOM extractors → structured JSON manifest

URL → accessibility tree → DOM extractors → structured JSON manifest

No screenshots. No hand-maintained selectors. No fragile CSS paths that snap the moment a page redesigns.

No screenshots. No hand-maintained selectors. No fragile CSS paths that snap the moment a page redesigns.

What you get back

POST /manifest

{
"url": "https://example.com"
}

POST /manifest

{
"url": "https://example.com"
}

response:

{
"url": "https://example.com",
"current_page_state": "Contact page with a message form",
"actions": [
{
"id": "email-input",
"label": "Email",
"type": "input",
"description": "Email address field",
"required": true
},
{
"id": "message-input",
"label": "Message",
"type": "textarea",
"description": "Message field",
"required": true
},
{
"id": "submit-form",
"label": "Submit",
"type": "button",
"description": "Submits the contact form",
"required": false,
"requires": [["email-input"], ["message-input"]]
}
],
"navigation": [
{ "label": "Home", "url": "/" }
]
}

Agent instructions

Paste this into your agent's system prompt to teach it to use Manifest before interacting with a webpage:

Paste this into your agent’s system prompt to teach it to use Manifest before interacting with a webpage:

Integrate the Manifest API into this project.


Manifest turns a webpage into a structured JSON "action manifest": every clickable, fillable, or submittable element on the page, each with a resolved locator (CSS selector, ARIA role, and accessible name) and a requires field describing which other actions must be completed first. requires is an array of groups, ANDed together — each inner group is a set of alternatives where any one satisfies it (OR). A single required field is just a one-item group. It sits between raw browser access (a headless browser gives you a DOM, not a list of things you can do) and content extraction (which gives you text, not actions) — reach for it whenever an agent needs to decide what to click or fill next instead of guessing selectors.


Preferred integration: MCP. Add the MCP server "io.omfang/manifest" to this project's MCP client config (also listed on Smithery if your tool installs from there). It exposes a streamable-http endpoint:


url: https://manifest.omfang.io/mcp header: x-api-key: ${apiKey}


Fallback: REST. If this setup doesn't support MCP yet, call the API directly:


Base URL: https://manifest.omfang.io Auth header: x-api-key: ${apiKey} Endpoint: POST /manifest Body: { "url": "<page to inspect>" }


Example response (either path returns this shape):


{ "current_page_state": "Login form with email/password fields", "actions": [ { "id": "email-input", "type": "input", "requires": [], "locator": { "css": "#email", "role": "textbox", "name": "Email" } }, { "id": "submit", "type": "button", "requires": [["email-input"], ["password-input"]], "locator": { "css": "button[type=submit]", "role": "button", "name": "Log in" } } ] }


Here, submit requires both email-input AND password-input — each is its own one-item group. A mutually-exclusive set (e.g. a size picker) would appear as a single group with multiple ids, like requires: [["size-5", "size-6", "size-7"]] — any one of those satisfies that group.


Prefer locator.role/locator.name over locator.css where possible — they hold up better across redesigns. Use requires to know which actions are still blocked on a prerequisite, and whether unblocking them means satisfying one alternative or several independent fields.

Why not just use a browser tool or a scraper?

Browser access

Browser access

Content extraction

Content extraction

Manifest

Manifest

Gives an agent a browser

Gives an agent a browser

✓

–

✓

Returns page content

Returns page content

✓

✓

✓

Returns available actions

Returns available actions

–

–

✓

Agent can reason about the output

Agent can reason about the output

–

Partially

Partially

✓

Survives UI redesigns

Survives UI redesigns

–

✓

✓

Required fields & input types

Required fields & input types

–

–

✓

Browser tools get an agent onto the page. Content tools get it the text. Manifest is the layer that tells it what to click, fill, and submit — and what's mandatory before it can move on.

Browser tools get an agent onto the page. Content tools get it the text. Manifest is the layer that tells it what to click, fill, and submit — and what's mandatory before it can move on.

Choose the right plan

Free

$0

50 Manifest calls / month

250 Fingerprint calls / month

No overage

Starter

$29 / mo

1,000 Manifest calls / month

5,000 Fingerprint calls / month

$0.08 / call overage

Pro

$79 / mo

5,000 Manifest calls / month

25,000 Fingerprint calls / month

$0.05 / call overage

Enterprise

Custom

Custom Manifest calls

Custom Fingerprint calls

Custom overage

Cached responses are always fast and never count against your rate limit the same way a cold request does — most agents hit the same handful of URLs repeatedly, so cache hits keep costs predictable.

Cached responses are always fast and never count against your rate limit the same way a cold request does — most agents hit the same handful of URLs repeatedly, so cache hits keep costs predictable.

omfang logo

Follow us on social media

Contact us

Learn more about omfang

omfang logo

Follow us on social media

Contact us

Learn more about omfang

omfang logo

Follow us on social media

Contact us

Learn more about omfang