Site access: caller access rules against observed site facts
Checks whether an intended action on a website (read, crawl, submit, log in, ...) satisfies the access rules the caller supplies (robots rule read, terms clause, login present, rate-limit budget, captcha seen) against facts the caller observed, and says which rule blocked it or which fact is missing. For an agent deciding whether to proceed or ask. It is a reading of the caller's rules, not legal permission, and it never fetches the site; an action no supplied rule covers is unknown.
What you get
Separates blocked from not-yet-verified before an agent touches a site.
Call it
Send the JSON body below to https://agents.writerslogic.com/api/v1/site-access-check. An unpaid request answers 402 with the price and how to pay; a request that fails with a 5xx status is not charged.
curl -i -X POST https://agents.writerslogic.com/api/v1/site-access-check \
-H 'content-type: application/json' \
-d '{"action":"crawl","rules":[{"id":"robots-allows-path","appliesTo":["crawl","read"],"needs":[{"key":"robots_allows_path","equals":true}]},{"id":"no-login-wall","appliesTo":["crawl","read"],"forbid":true,"needs":[{"key":"login_required"}]},{"id":"terms-allow-automation","appliesTo":["crawl"],"needs":[{"key":"terms_allow_automation","equals":true,"maxAgeDays":30}]}],"evidence":[{"key":"robots_allows_path","value":true},{"key":"login_required","value":false},{"key":"terms_allow_automation","value":true,"asOf":"2026-10-20"}],"asOf":"2026-11-04"}'
Input
| Field | Type | Required | Description |
|---|---|---|---|
action | string; length 0..60 | yes | The intended action, matched against each rule's appliesTo. |
rules | array<object>; max 100 items | yes | Access rules: needs that must hold, or with forbid:true, conditions that must not apply. |
evidence | array<object>; max 500 items | yes | Observed site facts. |
asOf | string; length 0..40 | no | Reference instant (ISO date or instant) for evidence age; required only when a need sets maxAgeDays. The check never reads the clock. |
Example request body
{
"action": "crawl",
"rules": [
{
"id": "robots-allows-path",
"appliesTo": [
"crawl",
"read"
],
"needs": [
{
"key": "robots_allows_path",
"equals": true
}
]
},
{
"id": "no-login-wall",
"appliesTo": [
"crawl",
"read"
],
"forbid": true,
"needs": [
{
"key": "login_required"
}
]
},
{
"id": "terms-allow-automation",
"appliesTo": [
"crawl"
],
"needs": [
{
"key": "terms_allow_automation",
"equals": true,
"maxAgeDays": 30
}
]
}
],
"evidence": [
{
"key": "robots_allows_path",
"value": true
},
{
"key": "login_required",
"value": false
},
{
"key": "terms_allow_automation",
"value": true,
"asOf": "2026-10-20"
}
],
"asOf": "2026-11-04"
}
Result
The response is { "data": ..., "_provenance": ... }. data carries these fields; _provenance is a signed W3C Verifiable Credential with a C2PA-style manifest, checked free at POST /api/v1/verify-provenance.
| Field | Type | Required | Description |
|---|---|---|---|
status | string; one of "pass", "fail", "unknown", "unsupported" | no | pass: every rule held. fail: a rule was violated (see witnesses). unknown: the input lacks the evidence to decide. unsupported: outside what this engine covers. Missing evidence is never a pass. |
requirements | array<object> | no | |
counts | object | no | Non-optional requirements by state; optional ones are counted separately. |
action | string | no | |
reading | string; one of "allowed-by-supplied-rules", "blocked-by-supplied-rules", "undetermined" | no | |
blockedBy | array<string>; max 100 items | no | Ids of rules that block the action. |
undetermined | array<string>; max 100 items | no | Ids of rules the evidence cannot decide. |
witnesses | array<object> | no | |
versions | object | no | Every semantic dependency of this answer (engine, tables and their as-of dates, tokenizer, calendar, rounding profile). |
limits | array<string> | no | |
deterministic | boolean | no | Always true: pure code, no model. |
Pay and connect
Available through: x402 (USDC on Base), MCP. MCP clients reach it through the compliance-evidence-kit package.
Machine-readable
- This agent as JSON (schemas, example, OpenAPI operation)
- Free signed sample response
- OpenAPI 3.1 · Catalog · Index of every agent