What’s in a schema
A schema for a Shopify store might include:| Endpoint | Method | URL | What it does |
|---|---|---|---|
shopify_products | GET | /products.json | List the product catalog |
shopify_product | GET | /products/{handle}.json | Get a single product |
add_to_cart | POST | /cart/add.js | Add a variant to the cart |
get_cart | GET | /cart.js | Get current cart contents |
Content-Type: application/json), and enough metadata for an agent to construct a valid HTTP request.
Schema format
Schemas are JSON documents. Here’s a minimal example:Required fields
| Field | Type | Description |
|---|---|---|
site | string | The domain this schema covers (e.g. allbirds.com). Normalized to lowercase. |
intent_category | string | Must match a category from the intent taxonomy (e.g. commerce, travel, jobs). |
schema_format_version | string | Must be "0.1" (current version). Defaults to "0.1" if omitted. |
Optional fields
| Field | Type | Description |
|---|---|---|
name | string | Human-readable name for the schema |
description | string | What this schema covers |
version | number | Schema version number (informational) |
endpoints | array | Read-shaped API endpoints (GET requests that return data) |
actions | array | Write-shaped or interactive actions (POST requests, cart operations, etc.) |
requires_stealth | boolean | Whether the site requires TLS fingerprinting to avoid bot detection |
session | object | Session bootstrap configuration (cookies, headers needed before requests work) |
Capability badges
The registry surfaces capability signals as badges so agents know what a request requires:| Badge | Source field | What it means |
|---|---|---|
| Requires browser | requires_stealth: true | The site needs Chrome-like TLS fingerprinting. Agents should use a stealth HTTP client or the CLI’s --stealth flag. |
| Requires session | session object present | The site needs cookies or headers bootstrapped before API calls work (e.g. clearance cookies for Cloudflare-protected sites). |
| Has auth | headers containing Authorization or X-API-* keys | The endpoint requires authentication headers. |
Contributing a schema
Anyone with an API key can push a schema. There are three paths:Option 1: Discover with the CLI toolkit
Option 2: Let your agent do it
hermai-contribute skill and can run the discovery + push workflow autonomously. See hermai-ai/hermai-skills.
Option 3: Write and push manually
If you already know the site’s API (from DevTools, documentation, or testing), you can write the schema JSON yourself and push it via the API:Validation rules
Every push runs through validation. If any check fails, the push is rejected with a specific error code. Structure checks:| Rule | Error code | Description |
|---|---|---|
| Valid JSON | INVALID_JSON | The body must parse as JSON |
site present | MISSING_FIELD | The site field is required |
intent_category present | MISSING_FIELD | The intent_category field is required |
| Category exists | UNKNOWN_CATEGORY | The intent_category must match a slug in the taxonomy. Call GET /v1/categories to see valid values. |
| Format version | UNSUPPORTED_FORMAT | schema_format_version must be "0.1" |
| Rule | Error code | Description |
|---|---|---|
| Forbidden names | FORBIDDEN_NAME | Schema names must not describe circumvention techniques. Rejected patterns: bypass, circumvent, cf-clearance, anti-bot, rotate-ip. Name the schema after what it does (e.g. shopify-products), not how it beats a defense. |
| Forbidden fields | FORBIDDEN_FIELD | Schemas must not contain credential or operational secret fields at any nesting depth. See forbidden fields list below. |
| Exclusion list | SITE_EXCLUDED | Some sites have requested removal from the registry. Pushing a schema for an excluded site is rejected. |
Forbidden fields
These JSON keys are rejected if found anywhere in the schema, at any depth:| Field | Why it’s forbidden |
|---|---|
proxy_credentials | Actual proxy login credentials — a secret that must never be published |
residential_proxy | Proxy infrastructure configuration — operational, not schema data |
clearance_cookie_js | JavaScript used to generate clearance cookies — an arms-race implementation detail |
clearance_cookies | Ephemeral session cookies — site-specific and time-limited, not useful to other users |
bypass_method | Describes a circumvention technique — violates naming policy |
stealth_script | Custom anti-detection JavaScript — operational, not schema data |
tls_fingerprint | Specific TLS profile identifier — this changes frequently and is better managed by the CLI runtime than baked into a schema |
Capability signals are allowed. The distinction is between metadata that helps agents understand what a site requires (like
requires_stealth: true) and operational secrets that describe how to bypass a defense (like proxy_credentials: "user:pass@host"). The former belongs in schemas; the latter belongs in the CLI runtime.Content addressing
Each schema is hashed (SHA-256 of canonical JSON with sorted keys). The hash becomes the version ID. Pushing the same content twice for the same site is a no-op — the registry recognizes it as a duplicate.Verified badge
Schemas are community-contributed and unverified by default. The Hermai team reviews schemas and awards a verified badge to those that meet quality standards. Agents can filter to verified schemas only:Schema versioning
Each push creates a new version. The registry tracks which version is “latest” for each site. When you query the catalog, you get the latest version by default. Version history is available:Public card vs full package
The registry exposes two views of every schema: Public card (no API key needed) — metadata about what the schema does:- Site, category, name, description
- Endpoint names, methods, descriptions
- Variable names and sources (path/query/body)
- Query parameter keys and whether they’re required
- Response field names and types (top level only)
- Capability badges (requires browser, requires session, has auth)
- URL templates with actual URLs
- Header values
- Body templates
- Session configuration
- Variable patterns and defaults