# Agent readiness

> Scan how ready a name of the zone is for AI agents, robots.txt rules, sitemap, llms.txt, markdown and structured data.

The agent readiness scan checks over HTTPS how ready a name is for AI agents (robots.txt AI rules and Content-Signal, sitemap, llms.txt, markdown, structured data…) and stores the result.

| Operation | Endpoint |
|---|---|
| [Get agent readiness](https://developers.openwaf.dev/api/agent-readiness/#get-agent-readiness) | `GET /v1/orgs/{org}/zones/{zone}/agent-readiness` |
| [Scan agent readiness](https://developers.openwaf.dev/api/agent-readiness/#scan-agent-readiness) | `POST /v1/orgs/{org}/zones/{zone}/agent-readiness/scan` |

## Get agent readiness

```http
GET /v1/orgs/{org}/zones/{zone}/agent-readiness
```

Returns the last agent readiness scan of a name of the zone (`404` if there is none). Without `host`, the most recent scan of any name.

**Required role:** `readonly` or higher.

#### Parameters

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| `org` | path | string (uuid) | Yes | Organization id. Every route checks that it is the token's organization (otherwise `404`). |
| `zone` | path | string (uuid) | Yes | Zone id (see [List zones](https://developers.openwaf.dev/api/zones/#list-zones)). |
| `host` | query | string | No | A name of the zone; without it, the most recent scan of any name. |

#### Response

- `200`: Returns [AgentReadiness](https://developers.openwaf.dev/api/schemas/#agent-readiness).

| Field | Type | Description |
|---|---|---|
| `host` | string |  |
| `scanned_at` | string (date-time) |  |
| `score` | integer | From 0 to 100. |
| `verdict` | string |  |
| `levels` | array of object |  |
| `levels[].id` | string | Id. |
| `levels[].passed` | integer |  |
| `levels[].total` | integer |  |
| `levels[].checks` | array of object |  |

#### Errors

| Status | Description |
|---|---|
| `400` | Malformed request (`bad_request`). |
| `404` | Not found, or not visible to the token (`not_found`). |

#### Example

**curl**


```sh
curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/agent-readiness?host=www.example.com" \
  -H "Authorization: Bearer $OPENWAF_TOKEN"
```

**TypeScript**


```ts
import { OpenWAF } from "./openwaf";

const owf = new OpenWAF({ baseUrl: "https://dash.openwaf.dev" }); // token from OPENWAF_TOKEN
const result = await owf.getAgentReadiness({
  zone: "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d",
  host: "www.example.com"
});
```

**Python**


```py
from openwaf import OpenWAF

owf = OpenWAF(base_url="https://dash.openwaf.dev")  # token from OPENWAF_TOKEN
result = owf.get_agent_readiness(zone="6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d", host="www.example.com")
```



```json
{
  "host": "www.example.com",
  "scanned_at": "2026-10-27T09:30:00Z",
  "score": 0,
  "verdict": "example",
  "levels": [
    {
      "id": "example",
      "passed": 0,
      "total": 128,
      "checks": [
        {}
      ]
    }
  ]
}
```

## Scan agent readiness

```http
POST /v1/orgs/{org}/zones/{zone}/agent-readiness/scan
```

Scans a name of the zone now over HTTPS and stores the result. The name is resolved and only public addresses are contacted, with time and size limits. Once per name per minute.

**Required role:** `tech` or higher.

#### Parameters

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| `org` | path | string (uuid) | Yes | Organization id. Every route checks that it is the token's organization (otherwise `404`). |
| `zone` | path | string (uuid) | Yes | Zone id (see [List zones](https://developers.openwaf.dev/api/zones/#list-zones)). |

#### Request body

Content type `application/json`. The body is optional.

| Field | Type | Required | Description |
|---|---|---|---|
| `host` | string | No | The zone apex by default. |

#### Response

- `200`: Returns [AgentReadiness](https://developers.openwaf.dev/api/schemas/#agent-readiness).

| Field | Type | Description |
|---|---|---|
| `host` | string |  |
| `scanned_at` | string (date-time) |  |
| `score` | integer | From 0 to 100. |
| `verdict` | string |  |
| `levels` | array of object |  |
| `levels[].id` | string | Id. |
| `levels[].passed` | integer |  |
| `levels[].total` | integer |  |
| `levels[].checks` | array of object |  |

#### Errors

| Status | Description |
|---|---|
| `400` | Malformed request (`bad_request`). |
| `403` | The token's role or limits do not allow it (`forbidden`). |
| `404` | Not found, or not visible to the token (`not_found`). |
| `429` | Too many requests (`rate_limited`); wait `Retry-After` seconds. |
| `503` | Not available right now (`unavailable`); retry later. |

#### Example

**curl**


```sh
curl -X POST "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/agent-readiness/scan" \
  -H "Authorization: Bearer $OPENWAF_TOKEN" \
  -H "Content-Type: application/json" \
  --data '{
    "host": "www.example.com"
  }'
```

**TypeScript**


```ts
import { OpenWAF } from "./openwaf";

const owf = new OpenWAF({ baseUrl: "https://dash.openwaf.dev" }); // token from OPENWAF_TOKEN
const result = await owf.scanAgentReadiness({
  zone: "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d",
  body: {
    host: "www.example.com"
  }
});
```

**Python**


```py
from openwaf import OpenWAF

owf = OpenWAF(base_url="https://dash.openwaf.dev")  # token from OPENWAF_TOKEN
result = owf.scan_agent_readiness(
    zone="6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d",
    body={
        "host": "www.example.com"
    },
)
```



```json
{
  "host": "www.example.com",
  "scanned_at": "2026-10-27T09:30:00Z",
  "score": 0,
  "verdict": "example",
  "levels": [
    {
      "id": "example",
      "passed": 0,
      "total": 128,
      "checks": [
        {}
      ]
    }
  ]
}
```
