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

# Set a DID delivery policy

> Create or replace the ordered routing rules owned by a DID

Create or replace the one delivery policy for a DID scope. The complete replacement uses an authorized policy-controller signature and current policy nonce.

The Directory validates recognized conditions and actions, service references, graph shape, bounds, priorities, and rule IDs before it submits the policy. The chain independently enforces authorization and security-critical bounds.

## Request

<ParamField path="did" type="string" required>
  The URL-encoded DID. It must equal `policy.scope.id`.
</ParamField>

<ParamField body="policy" type="object" required>
  A complete [delivery policy](/concepts/delivery-policies#policy-structure). Rule IDs must be unique.
</ParamField>

<ParamField body="policy.policy_id" type="string" required>
  Deterministic 32-byte policy identifier encoded as `0x` plus 64 hexadecimal characters.
</ParamField>

<ParamField body="nonce" type="string" required>
  Current policy nonce for the DID scope.
</ParamField>

<ParamField body="valid_until" type="string" required>
  Unix time in milliseconds at which the authorization expires.
</ParamField>

<RequestExample>
  ```bash Request theme={null}
  curl --request PUT \
    --url "https://directory.example.com/delivery-policies/dids/did%3Aopenpayload%3A1111111111111111111111" \
    --header "Content-Type: application/json" \
    --data '{
      "did": "did:openpayload:1111111111111111111111",
      "action": "set_did_policy_v2",
      "policy": {
        "policy_id": "0x<64-hex-policy-id>",
        "scope": {
          "type": "DID",
          "id": "did:openpayload:1111111111111111111111"
        },
        "revision": 2,
        "operator_did": "did:openpayload:1111111111111111111111",
        "ruleset": [
          {
            "id": "confidential-route",
            "priority": 100,
            "conditions": [
              {"type": "TagEquals", "value": "Confidential"}
            ],
            "constraint_overrides": {
              "requested_cache_seconds": 3600,
              "max_unchunked_message_bytes": 8388608,
              "max_replicas": 1
            },
            "action": {
              "type": "DeliveryPlan/v1",
              "entry_step": "relay",
              "steps": [
                {
                  "id": "relay",
                  "operation": "Forward",
                  "targets": [
                    {
                      "service_did": "did:openpayload:1111111111111111111111",
                      "service_id": "did:openpayload:1111111111111111111111#relay",
                      "priority": 100,
                      "weight": 100
                    }
                  ]
                }
              ],
              "transitions": []
            }
          }
        ]
      },
      "nonce": "<policy-nonce>",
      "valid_until": "<epoch-milliseconds>",
      "signer_key_id": "did:openpayload:1111111111111111111111#keys-1",
      "canonical_payload": "<encoded-scale-payload>",
      "signature": "<base64-ed25519-signature>"
    }'
  ```
</RequestExample>

## Response

```json 202 Response theme={null}
{
  "status": "accepted",
  "did": "did:openpayload:1111111111111111111111",
  "extrinsic": "apply_policy_v2_with_proof",
  "tx_hash": "<transaction-hash>",
  "message": "Chain extrinsic submitted"
}
```

`202 Accepted` means accepted for processing. Resolve the policy from finalized state to confirm the active revision.

## Straight to the point

```http theme={null}
PUT /delivery-policies/dids/{url-encoded-did}
```

* Operation: complete create or replacement
* Action: `set_did_policy_v2`
* Revision: `1` on creation, otherwise finalized revision plus one
* Authorization: DID policy controller
* Invalid graph, unknown action, incompatible service, or non-public route endpoint: `400 invalid_delivery_policy`
* Accepted submission: `202`


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.