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

# Execute Deposit

<div className="venue-tags" aria-label="Supported venues">
  <span className="venue-tag">Hyperliquid</span>
  <span className="venue-tag">Polymarket</span>
</div>

Submits a previously issued deposit quote. The Polymarket launch route funds Polygon pUSD from
HyperCore USDC.

## Endpoint

```text theme={null}
POST /exchange
```

## Request Body

| Parameter        | Type   | Description                                    |
| ---------------- | ------ | ---------------------------------------------- |
| `action`\*       | object | Deposit execution payload                      |
| `nonce`\*        | number | Replay-protection nonce, e.g., `1785254405000` |
| `expiresAfter`\* | number | Signed request expiry, e.g., `1785254455000`   |
| `signature`\*    | object | User's EIP-712 signature                       |

### action

| Field     | Type   | Description                         |
| --------- | ------ | ----------------------------------- |
| `type`\*  | string | Must be `"executeProtocolTransfer"` |
| `terms`\* | object | Signed deposit terms                |

### action.terms

| Field     | Type   | Description                                              |
| --------- | ------ | -------------------------------------------------------- |
| `kind`\*  | string | Must be `"quoted"` for the Polymarket route              |
| `quote`\* | object | Exact `quote` object returned by `protocolTransferQuote` |

```typescript theme={null}
const request = {
  action: {
    type: "executeProtocolTransfer",
    terms: {
      kind: "quoted",
      quote, // Complete object returned by protocolTransferQuote
    },
  },
  nonce: 1785254405000,
  expiresAfter: 1785254455000,
  signature: {
    r: "0x1234...",
    s: "0x5678...",
    v: 27,
  },
};
```

Sign the action containing the complete quote, then JSON-serialize the resulting request.

## Response

<Tabs sync={false}>
  <Tab title="200: Pending">
    ```json theme={null}
    {
      "status": "ok",
      "response": {
        "type": "executeProtocolTransfer",
        "data": {
          "transactionId": "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
          "transferId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
          "status": "pending",
          "blockNumber": 123456
        }
      }
    }
    ```
  </Tab>

  <Tab title="503: Unavailable">
    ```json theme={null}
    {
      "error": "Protocol transfers are temporarily unavailable",
      "code": "SERVICE_UNAVAILABLE",
      "timestamp": 1785254400000,
      "retryAfter": 5
    }
    ```
  </Tab>
</Tabs>

An accepted request returns `pending`; the transfer continues after the HTTP response. Poll
`protocolTransferStatus` with `transferId` until its status is `completed` or `failed`.

## Authorization Rules

* The wallet in `quote.terms.userAddress` must directly sign the complete action.
* Approved API wallets (agents) cannot initiate protocol transfers.
* `expiresAfter` must be in the future and cannot be later than `quote.terms.expiresAt`.
* The quote must still be authentic and unexpired, and the route must remain enabled.
* The first-step source amount is reserved when the request is accepted.

<Warning>
  Do not submit funds directly to `quote.terms.steps[].provider.paymentInstruction`. Execution is
  initiated only by the accepted, signed `executeProtocolTransfer` request.
</Warning>
