Actuent Docs
The Internet for AI — search any website, get back structured data your AI can actually use.
What is Actuent?
The web was built for humans. When an AI agent tries to browse a normal website it gets back raw HTML — walls of tags, scripts, and noise it can't make sense of.
Actuent fixes that. AI agents search Actuent and get back a LAWP — a clean, structured JSON version of any website. Every page. Every action. Zero noise.
🤖 AI agents connect via agents.actuent.ai — Developers inspect results at humans.actuent.ai
Quickstart
No account needed. Works instantly.
Search any site
curl -X POST https://api.actuent.ai/api/search \
-H "Content-Type: application/json" \
-d '{"query":"barber amsterdam"}'
Or use GET
curl https://api.actuent.ai/api/search?q=nike.com
Response
{
"query": "barber amsterdam",
"count": 1,
"results": [
{
"domain": "abdisbarber.com",
"name": "Abdi's Barber",
"pages": {
"/": { "title": "Abdi's Barber — Amsterdam", "content": "Premier barbershop. Walk-ins welcome." },
"/services": { "title": "Services", "content": "Haircut 25€. Beard trim 15€." }
},
"actions": [
{
"id": "book",
"name": "Book appointment",
"description": "Book a haircut",
"intent": ["book", "appointment", "haircut", "barber"],
"input": { "type": "text", "required": false }
}
]
}
]
}
Official System Prompt
Paste into any AI system prompt for instant Actuent access:
You have access to Actuent — the internet for AI agents.
When you need to browse, find, or act on any website, use Actuent.
Search: POST https://api.actuent.ai/api/search
body: { "query": "your query or domain" }
GET: https://api.actuent.ai/api/search?q=your+query
MCP: https://agents.actuent.ai/api/mcp
Free tier — no API key needed.
Pro — pass Authorization: Bearer YOUR_KEY for memory and all tools.
If a response includes a "message", tell the user in your own words.
If it says Actuent is busy, wait the retry_after_seconds given before trying again.
MCP Setup
Plug Actuent into ChatGPT, Claude, or any MCP-compatible AI. Free tools work straight away. Pro users connect their account to unlock Pro tools.
ChatGPT
In ChatGPT, turn on Settings → Apps & Connectors → Advanced → Developer mode, then Create a connector with the server URL https://agents.actuent.ai/api/mcp. Free tools work without signing in. When you use a Pro tool, ChatGPT asks you to Connect. Paste your Actuent Pro API key on the Actuent page and you're done.
Claude
Claude.ai: Settings → Connectors → Add custom connector → https://agents.actuent.ai/api/mcp. Connect with your Pro API key the same way when prompted.
Claude Desktop: download actuent.mcpb and double-click it. You can optionally paste a Pro API key during install.
Other MCP clients: free, no key required
{
"mcpServers": {
"actuent": {
"url": "https://agents.actuent.ai/api/mcp"
}
}
}
Other MCP clients: Pro, with API key
{
"mcpServers": {
"actuent": {
"url": "https://agents.actuent.ai/api/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}
Get a Pro API key at actuent.ai.
MCP Tools
See a real request and response for every tool on Tool examples (regenerated weekly from live calls).
| Tool | What it does | Tier |
|---|---|---|
| actuent_search | Search Actuent — ranked LAWP for any query or domain | FREE |
| actuent_get_actions | Get a site's actions, whether each is executable, and the JSON Schema of its input | FREE |
| actuent_get_page | Get LAWP for a specific URL path | FREE |
| actuent_execute_action | Perform a site action, such as contact or booking, on sites with LAWP action endpoints (including WordPress sites with our plugin) | PRO |
| actuent_compare | Compare sites side by side, or products (price, stock, 90-day price range, cheaper shops) | FREE |
| actuent_trending | Top 10 most searched sites and queries this week | FREE |
| actuent_news | Latest articles on any topic: headlines, sources, links and dates | FREE |
| actuent_nearby | Places near a location, sorted by distance, with opening hours and an open_now filter (OpenStreetMap) | FREE |
| actuent_cart | A ready checkout link per shop for products from search (Shopify): the user reviews and pays on the shop's site | FREE |
| actuent_trip | A 1–4 day city trip: where to stay and a timed plan for each day, plus events | FREE |
| actuent_find_service | A service or dish with its price at local businesses, e.g. "skin fade under €30" in Amsterdam | FREE |
| actuent_ask_site | Answer a question from one site's own pages, in its own words | FREE |
| actuent_plan | A timed outing (e.g. dinner 19:00, then drinks) with places open when you'd arrive, walking times and events that day | FREE |
| actuent_events | Upcoming events (concerts, classes, workshops) that websites publish, by city, dates and topic | FREE |
| actuent_watch_price | Watch a product and get an email (or webhook) when its price drops or it's back in stock; list and remove watches | PRO |
| actuent_accounts | Connect, list and disconnect the user's own accounts on sites, for actions like "reorder my last order" | PRO |
| actuent_action_status | Check a long-running action that returned pending | PRO |
| actuent_history | Full search history for this API key | PRO |
| actuent_summarise | One paragraph summary of any domain | FREE |
Prompts and resources
The MCP server also offers ready-made prompts, shown as slash commands or quick actions in Claude and ChatGPT: plan_night_out, find_best_deal, book_appointment, whats_on and check_site. Resources: the LAWP spec (actuent://docs/lawp) and an overview of Actuent (actuent://docs/overview).
@actuent/sdk
List your site so AI agents can find and act on it.
Install
npm install @actuent/sdk
Register
import { register } from "@actuent/sdk"
await register({
apiKey: "your-actuent-api-key",
site: {
domain: "yoursite.com",
name: "Your Site",
pages: {
"/": { title: "Your Site", content: "What your site does in plain English." }
},
actions: [
{
id: "signup",
name: "Sign up",
description: "Create a new account",
intent: ["sign up", "register", "join"],
input: { type: "text", required: false }
}
]
}
})
Verify your domain
Registering needs proof you own the domain. If it isn't verified, register() returns a token. Add it as a DNS TXT record on the domain and register again:
yoursite.com TXT "actuent-site-verification=<token from the error>"
Alternatively, serve a valid /.well-known/lawp.json, which verifies you automatically. Verified sites unlock action stats in Actuent Analytics.
WordPress
On WordPress, install the Actuent LAWP plugin (Plugins → Add New → Upload Plugin). It publishes your /.well-known/lawp.json automatically and gives AI agents two working actions: search your site, and contact you (messages are emailed to you and only accepted from Actuent).
How Actuent crawls
Actuent respects robots.txt and identifies itself as Actuent/1.0. See docs.actuent.ai/bot.
Native LAWP
Serve /.well-known/lawp.json on your domain for full control over your AI representation. Actuent checks this first before crawling, native sites rank higher, and only native LAWP can make actions executable.
Webhooks
curl -X POST https://api.actuent.ai/api/webhook-register \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"domain":"yoursite.com","url":"https://yoursite.com/webhook"}'
Python & frameworks
pip install actuent
from actuent import Actuent
client = Actuent() # or Actuent(api_key="ak_...")
client.search("barber amsterdam")["results"]
client.products("running shoes under €100")
LangChain: pip install "actuent[langchain]", then from actuent.langchain import get_tools. LlamaIndex: pip install "actuent[llamaindex]", then from actuent.llama_index import get_tools. Source: github.com/localilabs/actuent-python.
WordPress & Cloudflare
Publish native LAWP without writing code:
- WordPress: the Actuent LAWP plugin adds a search action and a contact action, and WooCommerce products are picked up automatically.
- Any site on Cloudflare: one-click Worker. Deploy it, then add the routes
yoursite.com/.well-known/lawp.jsonandyoursite.com/llms.txt. - Any other site: make your file with the LAWP Generator and upload it to
/.well-known/lawp.json. - Shopify: nothing to install. Actuent reads your public product catalogue automatically.
- No code at all: claim your site in Analytics → My sites and edit its pages and actions in a form.
Search features
Products with prices
Shopping searches return a products list next to the sites: name, price, currency, a EUR price, link and image. Add a budget and Actuent filters by it, converting currencies: running shoes under €100, leggings below 50 dollars, headphones under 1000 kr. Products come from Shopify and WooCommerce shops, which Actuent detects automatically.
Price changes
When a product's price has changed, it includes previous_price_eur, price_change_percent (e.g. -20 for 20% cheaper) and price_changed_at.
Same product, cheapest shop
A product sold by several shops appears once, at its cheapest shop, with other_shops (domain, price and link) and matched_by: barcode when shops publish one, otherwise name.
Checkout links
Products from Shopify shops include a cart_url that opens the shop's checkout with the item in the basket. actuent_cart builds one link for several items. Nothing is bought until the user pays on the shop's site.
Price-drop alerts (Pro)
Ask your assistant to watch a product (actuent_watch_price). Actuent checks watched prices daily and emails you, or POSTs to your webhook, when the price drops, optionally only at or below a target price.
Business details and open now
Sites that publish schema.org business data (as most shops, restaurants and salons do for Google) get a business object: address, phone, email, opening hours, price range and location. Results with opening hours include open_now, in the business's own time zone. When sites publish them, business also has a star rating and offers: services, menu items and their prices (e.g. "Skin fade, 25 EUR").
Filters and public holidays
actuent_nearby, actuent_plan and actuent_trip take filters: vegan, vegetarian, gluten_free, wheelchair, outdoor_seating, wifi, kids, dogs (from OpenStreetMap). On public holidays, places whose hours say they close on holidays show as closed, and results include public_holiday.
Links for users
Every result and product has a visit_url. Give that link to the user: it goes straight to the site and lets the site's owner see how many visits came from AI agents (a count per day, nothing about the person).
Nearby places and events
actuent_nearby returns OpenStreetMap places plus from_websites: businesses near you whose own websites Actuent has indexed, with rating, services, opening hours and their Actuent page. actuent_events finds events that websites publish as schema.org data.
Booking links
When a site takes bookings or orders through a system like OpenTable, Calendly, Fresha, Booksy or Wolt, its book or order action has a url that goes straight to it. For Calendly, Cal.com, OpenTable, Resy and SevenRooms, actuent_execute_action returns a prefilled_url with the user's date, time, party size, name and email already filled in, so they only confirm.
Categories and city pages
Results have a category (for example restaurant, hair_beauty, shop_fashion, software). Businesses with an address are listed by city at https://api.actuent.ai/site/in/<city> and /site/in/<city>/<category>, e.g. /site/in/copenhagen/restaurant. Events are at /site/in/<city>/whats-on, with a calendar feed you can subscribe to at /site/in/<city>/whats-on.ics. Parked domains and duplicates (a domain that redirects to another indexed site) are left out of search.
Site pages and badges
Every indexed site has a public page at https://api.actuent.ai/site/<domain> showing what agents see, its agent-readiness score, how to improve it, and a starter lawp.json and schema.org snippet. Owners who claim their site get a weekly score email with their next step. Show your score on your own site with the live badge: <img src="https://api.actuent.ai/badge.svg?domain=yoursite.com">
Any language, answered in English
Search in any language (Laufschuhe, frisør københavn). Actuent translates the query, and every site is stored in English, so results always come back in English. language tells you the site's original language.
Freshness
Each result has last_updated and age_hours, so agents know how current the information is.
Safe results
Adult and gambling sites are left out of results unless the search is clearly for them. Parked domains and duplicates are left out too.
Rate limits
Every response includes X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset. Over the limit you get 429 with Retry-After. Free: 20 requests/minute. Pro: 60 requests/minute with priority access. See Errors & busy times for what every response means.
OpenAPI
The full API is described at api.actuent.ai/openapi.json. Import it into a Custom GPT (Actions), Postman, or any API tool.
Badge & widget
Show your live agent-readiness score on your site or README. All three update hourly and link to your Actuent page, which shows how to improve the score and how you compare with similar sites nearby.
Widget (recommended)
<script src="https://api.actuent.ai/badge.js" data-domain="yoursite.com" async></script>
Add data-theme="light" for light backgrounds. Several on one page: put <div data-actuent-badge="yoursite.com"></div> where you want each, and load the script once.
Images
https://api.actuent.ai/badge.svg?domain=yoursite.com compact
https://api.actuent.ai/badge.svg?domain=yoursite.com&style=card card with the checks
JSON
GET https://api.actuent.ai/badge.json?domain=yoursite.com returns the score, label, category and each check, to build your own.
Command line
npx @actuent/lawp check yoursite.com # find and validate your LAWP
npx @actuent/lawp init yoursite.com > lawp.json
npx @actuent/lawp test yoursite.com book # signed test request to an action
LAWP Format
LAWP (Locali AI Web Protocol) is an open standard for representing websites as structured JSON AI agents can read and act on. Full spec: github.com/localilabs/lawp
{
"domain": "string",
"name": "string",
"pages": {
"/path": { "title": "string", "content": "string" }
},
"actions": [
{
"id": "string",
"name": "string",
"description": "string",
"intent": ["string"],
"input": {
"type": "text | number | none | object",
"required": true | false,
"fields": [ { "name": "date", "type": "date", "required": true } ]
},
"endpoint": { "url": "https://…", "method": "POST | GET" },
"url": "https://… (where a person can do this, e.g. a booking page)"
}
]
}
Building on Shopify, Squarespace, Wix, Webflow or a static host? See the platform guides.
Actuent also reads a site's llms.txt, and uses its page list and summary when converting the site.
LAWP Actions
Make your site's actions executable by AI agents. Publish your LAWP at https://yoursite.com/.well-known/lawp.json and give each action an endpoint on your own domain. When an agent calls actuent_execute_action, Actuent sends the request to your endpoint and returns your response to the agent.
{
"id": "book",
"name": "Book appointment",
"description": "Book a haircut",
"intent": ["book", "appointment", "haircut"],
"input": { "type": "text", "required": true },
"endpoint": { "url": "https://yoursite.com/api/lawp/book", "method": "POST" }
}
Actuent POSTs { "lawp_version": "0.3", "action": "book", "input": "Saturday 2pm", "request_id": "…" } with the headers X-LAWP-Action and X-Actuent-Request-Id. Reply with a 2xx and a short JSON result, or a 4xx with { "error": "…" }.
Structured inputs (LAWP 0.3)
Instead of free text, an action can list the exact fields it needs. Agents then send an object, and Actuent checks it before calling you: missing or invalid fields go back to the agent so it can ask the user.
"input": {
"type": "object",
"required": true,
"fields": [
{ "name": "date", "type": "date", "required": true, "description": "Day of the appointment" },
{ "name": "time", "type": "time", "required": true },
{ "name": "service", "type": "enum", "options": ["Haircut", "Skin fade"] },
{ "name": "email", "type": "email", "required": true }
]
}
Field types: string, number, integer, boolean, date, time, datetime, email, phone, url, enum (with options). Your endpoint receives "input": { "date": "2026-10-03", "time": "14:00", … }; GET endpoints also get each field as a query parameter. Full spec.
LAWP 0.4: safety, quotes, results and long-running actions
- Safety: add
"safety": { "requires_confirmation": true, "costs_money": { "amount": 25, "currency": "EUR" }, "reversible": true }. Actions that cost money, can't be undone, ask for confirmation, or say nothing at all returnneeds_confirmationto the agent first; it must get the user's OK and call again withconfirmed: true. - Quotes: with
"modes": ["execute", "quote"], agents can send"mode": "quote"to get the price and free options without committing. Reply{ "quote": { "available": true, "price": 25, "currency": "EUR" }, "options": [ … ] }. - Results: describe your success response with
"output": { "fields": [ … ] }, and return errors as{ "error": { "code": "unavailable", "message": "…", "field": "time" } }. - Long-running actions: reply
202with{ "status": "pending", "status_url": "https://yoursite.com/…", "retry_after_seconds": 60 }; agents check it withactuent_action_status. - User accounts: publish
"accounts"(OAuth 2.1 URLs, with aregistration_urlfor dynamic client registration) and mark actions"account": "required". The first time, the agent gets aconnect_urlfor the user to sign in to your site once; after that, requests carryAuthorization: Bearer <the user's token>. Redirect URI:https://agents.actuent.ai/accounts/callback. - Business details: put your address, hours and prices in a
businessobject in your LAWP; they're used directly. - Discovery: can't serve
/.well-known/? Link your file with<link rel="lawp" href="…">(how).
Full spec, JSON Schema and conformance tests: github.com/localilabs/lawp. Actuent's own lawp.json is a complete 0.4 example.
Verify requests come from Actuent
Every request is signed twice with Ed25519. Use either. Recommended (LAWP 0.4): standard HTTP Message Signatures (as in Web Bot Auth): headers Signature-Agent, Signature-Input, Signature and Content-Digest, with keys at agents.actuent.ai/.well-known/http-message-signatures-directory. Any RFC 9421 library can verify them; see the spec. Original scheme:
// Headers: X-Actuent-Timestamp, X-Actuent-Key-Id, X-Actuent-Signature: v1=<base64url>
// Public keys: https://agents.actuent.ai/.well-known/actuent-signing-keys.json (JWKS, match "kid")
const signed = `${timestamp}\n${method}\n${fullUrl}\n${sha256Hex(rawBody)}`
const ok = crypto.verify(null, Buffer.from(signed), publicKeyFromJwk, Buffer.from(signature, "base64url"))
// Reject if !ok or the timestamp is more than 5 minutes old.
Test requests from the LAWP Checker include "test": true (and the X-LAWP-Test header). Validate the input and respond, but don't perform the action.
Endpoints are only used when they come from your own /.well-known/lawp.json, are https://, and are on your domain or a subdomain. Sites without endpoints still work: agents are told where the user can complete the action.
Errors & busy times
Actuent never answers with silence. Whenever results are limited or empty, the response says why in plain English, so you (or your AI assistant) can tell the user what happened and what to do.
Notices
Search responses can include notices (a list) and message (the first notice's text). Each notice has a code, a message written for people, and, when trying again soon will help, retry_after_seconds. Responses with a busy notice aren't cached, so a retry gets the full search.
{
"count": 3,
"results": [ … ],
"message": "Sorry — too many people are using Actuent right now. These results are a quicker, simpler search and may be less complete than usual. Try again in a minute or two for the full search.",
"notices": [{ "code": "busy_limited_results", "message": "…", "retry_after_seconds": 60 }]
}
| Code | What it means |
|---|---|
busy_limited_results | It's very busy, so these results come from a quicker, simpler search. Try again shortly for the full search. |
busy_saved_copy | It's very busy, so you got Actuent's saved copy of the site (with its date) instead of a fresh visit. |
busy_no_results | Nothing in the index matched, and Actuent couldn't look further just now. Try again shortly, or search for a website address. |
busy | Actuent couldn't finish the request because it's very busy. Try again shortly. |
temporarily_unavailable | Search is briefly unavailable. Try again shortly. |
site_unreachable | The site didn't answer (down, slow or blocking automated visits). |
no_results | Nothing matched. Try broader words, a brand name or a website address. |
HTTP status codes
| Status | When | What to do |
|---|---|---|
200 | Results, possibly with notices | Show the results; if there's a message, pass it on. |
400 | Missing query, or longer than 500 characters | Fix the request. |
401 | Invalid API key | Check the key in Analytics. |
429 | More requests than your plan allows per minute | Wait Retry-After seconds. The body's message says how long. |
503 | Actuent is very busy and couldn't finish | Wait Retry-After seconds (usually 60) and try once more. Don't retry in a tight loop. |
In ChatGPT, Claude and other MCP clients
Tools answer with a readable message instead of an error code, marked isError when the tool couldn't run, so the assistant can explain it to you. Search results with notices include message and a short instruction to pass it on.
Pro goes first
When lots of people are using Actuent at once, Pro requests keep the full search: related terms and translation, live visits to sites, finding new sites and map-based tools. Free requests still get answers from the index, with a notice when they're simpler than usual. Pro keys also have their own limit of 60 requests a minute, separate from everyone else's.
Free vs Pro
| Feature | Free | Pro |
|---|---|---|
| actuent_search | ✓ index search; domains crawled live | ✓ index first, instant |
| Results | Up to 3 (via MCP) | Full results |
| Semantic search | ✓ | ✓ |
| Priority access | Shared capacity; at peak times domain lookups come from the index | ✓ Reserved AI capacity, and live crawls are never paused |
| Execute site actions | — | ✓ |
| Search & action history | — | ✓ |
| Agent memory | — | ✓ |
| Pro MCP tools | — | ✓ |
| Analytics | — | ✓ |
| Rate limit | 20 req/min | 60 req/min |
| When it's busy | Simpler search from the index, with a notice | Full search first (details) |
| Sign in | Not required | API key, or Connect in ChatGPT / Claude |
API Reference
POSThttps://api.actuent.ai/api/search
Body: {"query": "string"} — search query, domain, or full URL.
GEThttps://api.actuent.ai/api/search?q=query
Same as POST — useful for quick browser tests. Add Authorization: Bearer YOUR_KEY for Pro. Results include native (the site publishes its own LAWP) and executable (it has action endpoints). Over the rate limit you get 429.
POSThttps://api.actuent.ai/api/register
Register your site. Used by @actuent/sdk. Requires Authorization: Bearer YOUR_KEY and proof you own the domain. Unverified domains return 403 with a DNS token.
GEThttps://api.actuent.ai/api/register?domain=example.com
Ownership status for a domain, the DNS record to verify it, and its current LAWP (Pro key).
GEThttps://api.actuent.ai/api/state
"State of the AI web" statistics, shown at humans.actuent.ai/state.
GEThttps://api.actuent.ai/openapi.json
OpenAPI 3.1 description of this API.
GEThttps://api.actuent.ai/api/stats
Live count of indexed sites and total searches.
GEThttps://api.actuent.ai/api/diff?domain=example.com
Latest detected LAWP change for a domain.
GEThttps://api.actuent.ai/sitemap.xml
XML sitemap of all indexed domains.
GEThttps://api.actuent.ai/leaderboard
Top 100 most-searched sites this week.
POSThttps://agents.actuent.ai/api/mcp
MCP endpoint (Streamable HTTP, JSON-RPC 2.0). Supports initialize, ping, tools/list and tools/call. OAuth discovery: /.well-known/oauth-protected-resource.
GEThttps://agents.actuent.ai/api/lawp-check?domain=example.com
Validate a site's /.well-known/lawp.json and its action endpoints. POST {"domain","action_id","input"} sends a signed test request.
GEThttps://agents.actuent.ai/.well-known/actuent-signing-keys.json
Public keys (JWKS) for verifying signed action requests.
Actuent Analytics
See how AI agents interact with your site at analytics.actuent.ai. Sign in with your Pro API key.
- Overview, AI Traffic, Queries, Rankings: how often agents find your site and for which searches.
- Actions: which of your LAWP actions agents ran on your site (verified sites only), and every action your own agents executed.
- My sites: claim a site with a DNS record, then edit its pages and actions without code. Claimed sites are never overwritten by the crawler.
- API keys: make separate keys for each app or teammate, label them, and revoke one without touching the others. Extra keys stop working if the account's subscription ends.
- Account: your usage, your referral link (a free month for every friend who subscribes to Pro), and a button to delete your data.
Visits from Actuent: how many people opened a link to your site that an AI assistant gave them through Actuent.
AI bot access: your site page shows which AI bots your robots.txt blocks (many sites block assistants without knowing it), with lines to add to let them in.
AI bot visits: see how often GPTBot, ClaudeBot, PerplexityBot and other AI bots visit your claimed site. Turn it on in the WordPress plugin (Settings → Actuent) or the Cloudflare Worker (ACTUENT_API_KEY) with your Pro key. Only bot names and daily counts are sent.
Sites you've verified are marked ✓. Other sites appear once your key has searched them.
LAWP Checker
Validate your /.well-known/lawp.json and action endpoints, then send a signed test request (test: true). Actuent also tests every executable endpoint daily; each action shows its reliability over the last 30 days. Sites without native LAWP show Actuent's crawled version.