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.
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
What you get back
cURL
Python
Node
curl -X POST https://manifest.omfang.io/manifest \
-H "X-API-Key: your-key-here" \
-H "Content-Type: application/json" \
-d '{"url": "https://omfang.io/contact"}'
Response:
{
"url": "https://omfang.io/contact",
"authenticated_user": null,
"current_page_state": "Contact page with a form for name, email, and message",
"actions": [
{
"id": "name-input",
"label": "Name",
"type": "input",
"description": "Text field for the sender's name",
"required": true
},
{
"id": "email-input",
"label": "Email",
"type": "input",
"description": "Email field for the sender's contact address",
"required": true
},
{
"id": "message-input",
"label": "Message",
"type": "textarea",
"description": "Free text field for the inquiry message",
"required": true
},
{
"id": "submit-contact-form",
"label": "Send message",
"type": "button",
"description": "Submits the contact form",
"required": false,
"requires": ["name-input", "email-input", "message-input"]
}
],
"navigation": [
{ "label": "Home", "url": "/" },
{ "label": "Manifest", "url": "/manifest" }
]
}
Why not just use a browser tool or a scraper?
✓
–
✓
✓
✓
✓
–
–
✓
–
Partially
✓
–
✓
✓
–
–
✓
Getting started
Manifest API makes any webpage agent-readable. Pass a URL, get back a structured JSON manifest describing what the page contains and what actions are available.
Authentication
All requests require an API key passed in the X-API-Key header. Keys are issued from your dashboard and can be rotated or revoked at any time.
X-API-Key: your-key-here
Requests without a valid key return
401 Unauthorized.
Endpoints
POST/manifest
Returns a structured action manifest for any URL.
Request:
JSON
{
"url": "https://example.com"
}
Response:
JSON
{
"url": "string",
"authenticated_user": "string | null",
"current_page_state": "string",
"actions": [
{
"id": "string",
"label": "string",
"type": "button | input | textarea | select | checkbox | radio | other",
"description": "string",
"required": "boolean",
"requires": ["string"]
}
],
"navigation": [
{ "label": "label", "url": "string" }
]
}
GET/health
Returns the API health status. No authentication required.
JSON
{ "status": "ok" }
GET/session-status
Returns whether the current browser session is valid. No authentication required
JSON
{ "valid": true }
or
JSON
{ "valid": false, "message": "Session expired" }
Response fields:
Field
Type
Description
url
string
The url that was requested
authenticated_user
string or null
Detected logged-in user, if any
current_page_state
string
Brief description of the page
actions
array
Interactive elements on the page
navigation
array
Primary navigation links
Action fields:
Field
Type
Description
id
string
Unique identifier for the action
label
string
Human-readable label
type
string
button, input, textarea, select, checkbox, radio, other
description
string
What the action does
required
boolean
Whether the field is required
requires
array of strings | omitted
Rate limits
Plans
Calls/month
Per-minute limit
Free
50
10/min
Starter
1,000
10/min
Pro
5,000
10/min
Exceeding the per-minute limits returns
429 Too Many Requests
Error codes
Code
Meaning
401
Missing or invalid API key
429
Rate limit exceeded
503
Browser session unavailable — retry later
Caching
Manifests are cached for 6 hours by default. Repeated requests for the same URL within that window are served instantly from cache at no extra cost to your call limit.