# RSL License

> Declare Really Simple Licensing terms via a robots.txt License directive and publish a valid license.xml with the right namespace, permits vocabulary, and payment types.

This check carries 2% of the score.

*These remediation guides are written in English.*

<a id="not-found"></a>

## No RSL license discovery found

ax-audit checked the three discovery mechanisms defined by RSL 1.0 and found none: the robots.txt `License:` directive, an HTTP `Link` header with `rel="license"`, and an HTML `<link rel="license" type="application/rsl+xml">` element.

The simplest path is the robots.txt directive plus a license document at your site root:

```
# robots.txt
License: https://your-site.com/license.xml

User-agent: *
Allow: /
```

```
<?xml version="1.0" encoding="UTF-8"?>
<rsl xmlns="https://rslstandard.org/rsl">
  <content url="/">
    <license>
      <permits type="usage">search ai-input</permits>
      <prohibits type="usage">ai-train</prohibits>
      <payment type="attribution">
        <standard>https://your-site.com/license-terms</standard>
      </payment>
    </license>
  </content>
</rsl>
```

This example allows search indexing and RAG/grounding, prohibits training, and requires attribution. Adjust to your policy: `<payment type="free"/>` for fully open content, or `crawl`/`use` types with an `<amount>` for paid licensing.

> **Note**
>
> A plain
>
> <link rel="license">
>
>  pointing to a Creative Commons page is
>
> not
>
>  RSL discovery: the link must carry
>
> type="application/rsl+xml"
>
>  and point to an RSL XML document.

---

<a id="relative-license-url"></a>

## License directive not an absolute URI

RSL 1.0 §4.4.1 requires the robots.txt directive value to be an absolute URI. `License: /license.xml` is invalid; use `License: https://your-site.com/license.xml`.

---

<a id="fetch-failed"></a>

## License document could not be fetched

Your discovery reference points to a URL that returns an error. Verify the document is published and reachable, including for non-browser user agents. Cloudflare-protected sites sometimes serve bot challenges on XML paths; add a WAF exception for your license document so crawlers can actually read your terms.

```
curl -sI https://your-site.com/license.xml
# Expected: HTTP/2 200, Content-Type: application/rsl+xml
```

---

<a id="wrong-content-type"></a>

## Wrong Content-Type

RSL documents must be served as `application/rsl+xml` (RSL 1.0 §2.2). Generic `application/xml` or `text/xml` works for lenient parsers but violates the spec.

```
# Nginx
location = /license.xml {
  types { }
  default_type application/rsl+xml;
}

# Vercel (vercel.json)
{
  "headers": [{
    "source": "/license.xml",
    "headers": [{ "key": "Content-Type", "value": "application/rsl+xml" }]
  }]
}
```

---

<a id="invalid-root"></a>

## Missing <rsl> root element

The document at your license URL is not an RSL document: common causes are an HTML error page served with status 200, or a different XML format. The root element must be `<rsl>`.

---

<a id="wrong-namespace"></a>

## Wrong or missing namespace

The root element must declare the default namespace exactly: `<rsl xmlns="https://rslstandard.org/rsl">`. Typos (http vs https, trailing slash) make conforming parsers reject the document.

---

<a id="no-content-elements"></a>

## No <content> elements

An RSL document without `<content>` elements licenses nothing. Each `<content>` identifies an asset (or path pattern, with `*` and `$` wildcards per RFC 9309) and wraps its `<license>` terms. Use `url="/"` to cover the whole site.

---

<a id="missing-content-url"></a>

## Missing url attribute on <content>

The `url` attribute is required on every `<content>` element: it is the canonical license identifier. An empty value (`url=""`) is only legal for documents associated to a page via `<link rel="license">`.

---

<a id="no-license-elements"></a>

## No <license> elements

Each `<content>` must contain at least one `<license>` element holding the actual terms (`<permits>`, `<prohibits>`, `<payment>`, `<legal>`).

---

<a id="invalid-permits"></a>

## Invalid permits/prohibits

The `type` attribute must be one of `usage`, `user`, or `geo`, and the element content must use the RSL 1.0 vocabulary:

- **usage:** `all`, `ai-all`, `ai-train`, `ai-input`, `ai-index`, `search`
- **user:** `commercial`, `non-commercial`, `education`, `government`, `personal`
- **geo:** ISO 3166-1 alpha-2 codes (`US`, `EU`, …)

> **Migrating from the 2025 draft**
>
> Pre-1.0 draft tokens (
>
> train-ai
>
> ,
>
> train-genai
>
> ,
>
> ai-use
>
> ,
>
> ai-summarize
>
> ) were replaced in RSL 1.0 by
>
> ai-train
>
> ,
>
> ai-input
>
> , and
>
> ai-index
>
> . Several large publishers still serve draft-era documents; conforming 1.0 parsers ignore those tokens, so update them.

When both `<permits>` and `<prohibits>` declare the same type, prohibitions take precedence.

---

<a id="invalid-payment-type"></a>

## Invalid payment type

Valid `<payment>` types: `purchase`, `subscription`, `training`, `crawl`, `use`, `contribution`, `attribution`, `free`. Omitting the type entirely means `free`.

```
<!-- Pay-per-crawl with explicit pricing -->
<payment type="crawl">
  <amount currency="USD">0.015</amount>
  <standard>https://your-site.com/licenses/pay-per-crawl</standard>
</payment>
```

---

Markdown representation of https://axrush.com/guides/rsl
