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

# Control who can cover a request with delegation conditions

> Write delegation-condition scripts in OpalScript to decide which delegates are eligible to cover an access request.

export const SectionHeader = ({children}) => {
  return <div style={{
    fontWeight: "bold",
    borderBottom: "1px solid #e5e7eb",
    paddingBottom: "0.25rem",
    marginBottom: "0.5rem"
  }}>
      {children}
    </div>;
};

A delegation-condition script decides which delegates are eligible to cover a given access request. When a request could be delegated, Opal runs the script and only the delegate user IDs it returns can act on that request.

Unlike a request-review script, a delegation-condition script does not approve or deny anything. It is a read-only check that runs the moment a request is created and returns a list of eligible delegates. It has no backing service user and no automation.

<Info>
  Delegation conditions are fail-closed. If the script returns an empty list, or never calls `actions.delegate`, no delegate is eligible and the request stays with its original reviewer.
</Info>

## Write a delegation-condition script

Read the request with `context.get_request()`, decide who may cover it, and declare the eligible delegates with `actions.delegate(...)`.

```python theme={null}
request = context.get_request()
target = entity.get_user(request.target_user_id or request.requester_id)

if target.tags.get("team") == "engineering":
    actions.delegate(["<engineering-lead-user-id>"])
else:
    actions.delegate([])
```

### context module

<SectionHeader> context.get\_request() </SectionHeader>

Returns the request being evaluated, with `requester_id`, `target_user_id`, `requested_resources`, and the other request fields. It is the same object documented for [request review](/docs/requestreview-getstarted#request-object).

### actions module

<SectionHeader> actions.delegate(user\_ids) </SectionHeader>

Declares the delegates eligible to cover the request. This call is terminal: the script ends when it runs.

<ParamField path="user_ids" type="list[string]" required>
  The user IDs of the eligible delegates. Pass an empty list to make no delegate eligible.
</ParamField>

The [utility modules](/docs/opalscript-utilitymodules), such as `entity` and `access`, are available too, so you can look up users, groups, and tags to make the decision.

## Use a delegation-condition script

Create a delegation-condition script, then set it as the condition on a request-reviewer delegation. The delegation forwards a request to a delegate only when the script makes that delegate eligible. When the script makes no delegate eligible, the request stays with its original reviewer.

## Examples

<SectionHeader> Delegate to the requester's manager </SectionHeader>

Let a requester's manager cover the request, and no one else.

```python theme={null}
request = context.get_request()
requester = entity.get_user(request.requester_id)

if requester.manager_id:
    actions.delegate([requester.manager_id])
else:
    actions.delegate([])
```

<SectionHeader> Delegate by team </SectionHeader>

Route each team's requests to that team's approver.

```python theme={null}
TEAM_APPROVERS = {
    "engineering": "<eng-approver-user-id>",
    "finance": "<finance-approver-user-id>",
}

request = context.get_request()
requester = entity.get_user(request.requester_id)
team = requester.tags.get("team")

if team in TEAM_APPROVERS:
    actions.delegate([TEAM_APPROVERS[team]])
else:
    actions.delegate([])
```
