> ## Documentation Index
> Fetch the complete documentation index at: https://docs.law4devs.eu/llms.txt
> Use this file to discover all available pages before exploring further.

# Requirements

> Query extracted compliance requirements with the Law4Devs Java SDK.

## Overview

Requirements are structured, machine-readable compliance obligations extracted from articles. They are classified by type and stakeholder role. Use `client.requirements()` to list and iterate them.

***

## Methods

### `list()`

Returns the first page of requirements across all frameworks.

```java theme={null}
Page<Requirement> page = client.requirements().list();

for (Requirement r : page.data()) {
    System.out.printf("[%s] %s — %s%n",
        r.frameworkSlug(), r.requirementType(), r.description());
}
```

**Returns** `Page<Requirement>`

***

### `list(String frameworkSlug)`

Returns the first page of requirements scoped to a specific framework.

```java theme={null}
Page<Requirement> page = client.requirements().list("cra");
```

**Returns** `Page<Requirement>`

***

### `list(String frameworkSlug, int page, int perPage)`

Fetch a specific page with custom page size.

```java theme={null}
Page<Requirement> page = client.requirements().list("nis2", 1, 50);
```

**Parameters**

| Parameter       | Type     | Default | Description                       |
| --------------- | -------- | ------- | --------------------------------- |
| `frameworkSlug` | `String` | `null`  | Scope to one framework (optional) |
| `page`          | `int`    | `1`     | Page number (1-indexed)           |
| `perPage`       | `int`    | `20`    | Items per page (max 100)          |

**Returns** `Page<Requirement>`

***

### `iter()`

Lazily iterate all requirements across all frameworks.

```java theme={null}
for (Requirement r : client.requirements().iter()) {
    System.out.println(r.description());
}
```

**Returns** `Iterable<Requirement>`

***

### `iter(String frameworkSlug)`

Lazily iterate all requirements for a specific framework.

```java theme={null}
for (Requirement r : client.requirements().iter("dora")) {
    System.out.printf("  [%s] %s%n", r.requirementType(), r.description());
}
```

**Returns** `Iterable<Requirement>`

***

## Model

### `Requirement`

| Field               | Type     | Description                                        |
| ------------------- | -------- | -------------------------------------------------- |
| `id()`              | `int`    | Internal numeric ID                                |
| `frameworkSlug()`   | `String` | Parent framework slug                              |
| `articleNumber()`   | `String` | Source article number                              |
| `requirementType()` | `String` | e.g. `"MUST"`, `"SHOULD"`, `"MAY"`                 |
| `description()`     | `String` | Human-readable requirement description             |
| `stakeholderRole()` | `String` | Target role, e.g. `"manufacturer"`, `"controller"` |
| `legalReference()`  | `String` | Article and paragraph reference                    |

***

## Examples

### List MUST requirements for CRA manufacturers

```java theme={null}
for (Requirement r : client.requirements().iter("cra")) {
    if ("MUST".equals(r.requirementType()) &&
        "manufacturer".equals(r.stakeholderRole())) {
        System.out.println("Art. " + r.articleNumber() + ": " + r.description());
    }
}
```

### Count requirements by framework

```java theme={null}
var counts = new java.util.LinkedHashMap<String, Integer>();
for (Requirement r : client.requirements().iter()) {
    counts.merge(r.frameworkSlug(), 1, Integer::sum);
}
counts.forEach((fw, n) -> System.out.printf("%-12s %d requirements%n", fw, n));
```

### Build a compliance checklist

```java theme={null}
var checklist = new java.util.ArrayList<String>();
for (Requirement r : client.requirements().iter("gdpr")) {
    if ("controller".equals(r.stakeholderRole())) {
        checklist.add("[ ] " + r.description());
    }
}
checklist.forEach(System.out::println);
```
