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>"
}'
Delivery policies
Set a DID delivery policy
Create or replace the ordered routing rules owned by a DID
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>"
}'
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
string
required
The URL-encoded DID. It must equal
policy.scope.id.object
required
A complete delivery policy. Rule IDs must be unique.
string
required
Deterministic 32-byte policy identifier encoded as
0x plus 64 hexadecimal characters.string
required
Current policy nonce for the DID scope.
string
required
Unix time in milliseconds at which the authorization expires.
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>"
}'
Response
202 Response
{
"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
PUT /delivery-policies/dids/{url-encoded-did}
- Operation: complete create or replacement
- Action:
set_did_policy_v2 - Revision:
1on 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

