---
title: "Submit a v3 (unified EIP-712) user-decryption request."
method: POST
path: "/v3/user-decrypt"
tags: ["User Decrypt v3"]
---

# Submit a v3 (unified EIP-712) user-decryption request.

`POST /v3/user-decrypt`

## Request body

- AttestedUserDecryptRequestJson — v3 user-decrypt request envelope. The relayer dispatches strictly by `attestationType`; the currently supported value is `"eip712-unified-user-decrypt-v1"`. Adding a Solana attestation later is a one-line widening of the dispatch table, not a v4 bump.
  - `attestationType` string, required — The attestation/signature scheme used for the `signature` bytes. Must equal `"eip712-unified-user-decrypt-v1"` for the current release.
  - `attestedPayload` Eip712UnifiedUserDecryptPayloadJson, required — The EIP-712 Unified User-Decryption Request payload (the `attestedPayload` body of the envelope).
    - `allowedContracts` string[], required — Allowlist of contracts whose handles may be decrypted under this request. May be empty (permissive mode).
    - `extraData` string, required — Extra data forwarded verbatim to the gateway contract. Accepts `"0x00"`, version `0x01` (`0x01` + 32-byte contextId), or version `0x02` (`0x02` + 32-byte contextId + 32-byte epochId). contextId must be 0x07-tagged and epochId must be 0x08-tagged (first byte of each).
    - `handles` HandleEntryJson[], required — One entry per ciphertext handle to decrypt. The list must be non-empty and must not exceed the existing v2 handle-count bound applied via `validate_handle_entries`.
      - `contractAddress` string, required — Address of the contract that produced this ciphertext handle. `0x` + 40 hex chars.
      - `ctHandle` string, required — Ciphertext handle from an on-chain FHE operation. `0x` + 64 hex chars.
      - `ownerAddress` string, required — Owner address for this handle. For direct-access handles this equals the request's `userAddress`; for delegated handles it differs. `0x` + 40 hex chars.
    - `publicKey` string, required — User's public key for re-encryption. `0x` + hex, minimum 2 hex chars after the prefix.
    - `requestValidity` RequestValiditySecondsJson, required — Request-validity window for the unified EIP-712 payload. Like `RequestValidityJson` but in seconds instead of days.
      - `durationSeconds` string, required — Number of seconds the request remains valid. Decimal string.
      - `startTimestamp` string, required — Unix timestamp (seconds) when this request becomes valid. Decimal string.
    - `type` string, required — Must equal `"user_decryption"`.
    - `userAddress` string, required — On-chain caller for the unified gateway call. `0x` + 40 hex chars.
    - `version` string, required — Must equal `"2.0"`.
  - `signature` string, required — Attestation signature: `0x`-hex, or empty for the ERC-1271 empty-signature path.

## Response `202`

Request accepted for processing.

- UserDecryptPostResponseJson
  - `requestId` string, required
  - `result` UserDecryptQueuedResult, required
    - `jobId` string, required
  - `status` string, required

## Other responses

- `400` — Invalid request
- `429` — Rate limited
- `500` — Internal server error

## Changes

- **2026-06-01** `a7216daccabe` — 1 info
  - endpoint added
- **2026-03-26** `10eb1d6af6bc` — 1 breaking
  - api path removed without deprecation

[Change history](https://skmtc.dev/zama-ai/apis/relayer-api/changes/v3/user-decrypt/post.md)

---

[API](https://skmtc.dev/zama-ai/apis/relayer-api.md) · [All operations](https://skmtc.dev/zama-ai/apis/relayer-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/zama-ai/relayer-api/revisions/23ec7991ea5e/schema)
