# TypeScript SDK — Account Services: Addresses & Deposits

Manage deposit addresses and the approved withdrawal address allowlist. All methods are on `client.accountServices` and use the `{ path, body }` input pattern because the network is a URL path parameter.

See the [API specifications](/api-specifications) for full request/response schemas and the [authentication guide](/tools/typescript-sdk/authentication) for setup.

## Methods

### createNewDepositAddress

`POST /v1/deposit/{network}/newAddress` · Authenticated · Fund Manager role · OAuth scope `addresses:create`

Generates a new deposit address for the specified network. Requires the **Fund Manager** role. The request body is [validated client-side](/tools/typescript-sdk/deep-dives/request-validation) — the SDK checks optional field types (`label`, `legacy`, `account`) before sending. The `account` field is optional for account-level API keys but **required** for Master API keys to target a specific sub-account.

```ts
const address = await client.accountServices.createNewDepositAddress({
  path: { network: "bitcoin" },
  body: { label: "cold-storage-inbound" },
});

console.log(address.address); // the new deposit address string
```

This is a POST mutation — never automatically retried. Creating duplicate addresses is safe — each call generates a distinct address.

### listDepositAddresses

`POST /v1/addresses/{network}` · Authenticated · Trader, Fund Manager, or Auditor role · OAuth scope `addresses:read` or `addresses:create`

Lists all previously generated deposit addresses for the specified network. The response is a bare array of `Address` objects.

```ts
const addresses = await client.accountServices.listDepositAddresses({
  path: { network: "ethereum" },
  body: {},
});

for (const addr of addresses) {
  console.log(`${addr.address} — ${addr.label ?? "(no label)"}`);
}
```

### createNewApprovedAddress

`POST /v1/approvedAddresses/{network}/request` · Authenticated · Fund Manager role · Trusted IP required · API key only

Requests approval of a new withdrawal address for the specified network. Requires the **Fund Manager** role and **Trusted IP** controls enabled on your account. This endpoint is **API-key only** — it is not accessible via OAuth. The request body is [validated client-side](/tools/typescript-sdk/deep-dives/request-validation) — `address` and `label` are required strings.

```ts
const result = await client.accountServices.createNewApprovedAddress({
  path: { network: "ethereum" },
  body: {
    address: "0x1234567890abcdef1234567890abcdef12345678",
    label: "treasury-wallet",
  },
});
```

> **Caveat:** Every newly approved address is subject to a **mandatory seven-day approval hold** before it can be used for withdrawals. This hold always applies and cannot be skipped. Plan withdrawal workflows accordingly.

### listApprovedAddresses

`POST /v1/approvedAddresses/account/{network}` · Authenticated · OAuth scope `addresses:read`

Lists all approved withdrawal addresses for the specified network on your account. Available to **any API-key role** (Trader, Fund Manager, or Auditor). OAuth callers require the `addresses:read` scope. The response is a **wrapper object** with an `approvedAddresses` array — not a bare array.

```ts
const response = await client.accountServices.listApprovedAddresses({
  path: { network: "bitcoin" },
  body: {},
});

for (const entry of response.approvedAddresses ?? []) {
  console.log(`${entry.address} — ${entry.label} (${entry.status})`);
}
```

### removeApprovedAddress

`POST /v1/approvedAddresses/{network}/remove` · Authenticated · Fund Manager role · OAuth scope `addresses:create`

Removes an address from the approved withdrawal allowlist. Requires the **Fund Manager** role. OAuth callers require the `addresses:create` scope. The request body is [validated client-side](/tools/typescript-sdk/deep-dives/request-validation) — `address` is a required string.

```ts
const result = await client.accountServices.removeApprovedAddress({
  path: { network: "ethereum" },
  body: { address: "0x1234567890abcdef1234567890abcdef12345678" },
});

console.log(result.message); // confirmation message
```

> **Caveat:** Removing an approved address is irreversible via this call. You'll need to re-approve the address (with its waiting period) to use it again.

## The `{ path, body }` input pattern

Every method on this page takes a single object with `path` and `body` keys. The `path` object supplies URL path parameters (here, `network`), while `body` contains the POST payload. The SDK adds transport fields (`nonce`, `request`) to the body automatically.

```ts
// All five methods follow this shape:
await client.accountServices.someMethod({
  path: { network: "ethereum" },
  body: { /* request-specific fields */ },
});
```

See the [patterns guide](/tools/typescript-sdk/patterns) for more on input shapes.

## What's next

- [Balances & Account](/tools/typescript-sdk/reference/account-services/balances-and-account) — account details and balance queries
- [Withdrawals & Transfers](/tools/typescript-sdk/reference/account-services/withdrawals-and-transfers) — moving funds
- [Request Validation](/tools/typescript-sdk/deep-dives/request-validation) — how client-side validation works
