---
title: "Register an account"
method: POST
path: "/register"
tags: ["Accounts"]
---

# Register an account

`POST /register`

## Request

- Base URL: `https://v1.orchestrator.rhinestone.dev/deposit-processor`
- URL: `https://v1.orchestrator.rhinestone.dev/deposit-processor/register`
- Auth: one of:
  - API key in header `x-api-key`
  - HTTP bearer
- TypeScript: <https://skmtc.dev/rhinestonewtf/apis/deposit-service-api/docs/register/post.ts> (a function with typed inputs; its response is checked against the schema)

Registers a smart account for deposits. Registration is idempotent for the registered project and destination: an existing address cannot be reassigned to another project, account kind, chain, token, or recipient. To change destination, derive and register a new address. User-owned registration is limited to enabled organizations; others register managed accounts with `POST /register-managed`.

## Headers

- `x-api-key` string: API key for authentication
- `x-api-version` string: API version identifier (e.g. "2026-04.amazon"). Optional today, will become required in a future release.

## Request body

- RegisterRequestBody: A repeat registration preserves owner, kind and destination. Omitted scopes remain stored; explicitly supplied, signed scopes replace existing-chain scopes and signed sessions. Replacing stored material does not revoke older sessions enabled on-chain.
  - `account` AccountInput, required: `target.recipient`, when an EVM address: Must not be a placeholder, burn or chain system address: the zero address, an address of one repeated hex digit (0x1111…, incl. HyperCore HYPE 0x2222…), 0x…dEaD, or a HyperCore token system address (0x20 followed by zeros and the token index). Such values are rejected with 400.
    - `address` string, required: Smart account address to register. Must not be a placeholder, burn or chain system address: the zero address, an address of one repeated hex digit (0x1111…, incl. HyperCore HYPE 0x2222…), 0x…dEaD, or a HyperCore token system address (0x20 followed by zeros and the token index). Such values are rejected with 400.
    - `accountParams` AccountParams, required
      - `factory` string, required: Ethereum address (0x followed by 40 hex characters)
      - `factoryData` string, required: Hex-encoded string (0x followed by hex characters)
      - `sessionDetails` EnableSessionDetails, required
        - `hashesAndChainIds` object[], required
          - `chainId` integer, required: Positive integer
          - `sessionDigest` string, required: Hex-encoded string (0x followed by hex characters)
        - `signature` string, required: Hex-encoded string (0x followed by hex characters)
      - `sessionScopes` SessionScopes
    - `target` Target, required: Destination target configuration. `chain` must be a CAIP-2 chain identifier such as "eip155:8453", "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", "tron:mainnet" or "hypercore:mainnet" — see `destination` on `/chains`. `token` and `recipient` follow the chain's address format: 0x-hex for EVM and HyperCore, base58 for Solana, base58check (T-prefixed) for Tron. Tron and HyperCore destinations require an explicit `recipient`, since the EVM account address is not an address on those chains and cannot be defaulted to. Once registered, the destination chain, token, and effective recipient are immutable: use a new address (or managed-account salt) to change them. The owning project may update `outputTokenRules` and `rejectUnmapped`; they remain subject to existing session scopes.
      - `recipient` string
      - `chain` string, required: CAIP-2 chain identifier (e.g. "eip155:8453")
      - `token` string, required
      - `outputTokenRules` OutputTokenRule[]
        - `match` OutputTokenRuleMatch, required: Source-token match criteria. Rules may match by source chain, source token address, source symbol, or a combination.
          - `chain` string: CAIP-2 chain identifier (e.g. "eip155:8453")
          - `token` string
          - `symbol` string
        - `outputToken` string, required
      - `rejectUnmapped` boolean
      - `postBridgeActions` unknown

## Response `200`

Account registered successfully

- RegisterResponse
  - `evmDepositAddress` string, required
  - `solanaDepositAddress` string
  - `tronDepositAddress` string

## Other responses

- `400`: Invalid account data or unauthorized
- `401`: Authentication required or the presented credential is invalid.
- `403`: API key lacks required deposits scope, the organization can't be billed, or user-owned accounts are not enabled for the organization (`USER_OWNED_ACCOUNTS_NOT_ENABLED`; use `POST /register-managed`)
- `409`: The address is already registered to a different project, account kind, or destination. Use a new address for a new destination.
- `429`: Retryable refusal; retry after the Retry-After delay. Registration is idempotent, so a retry reuses whatever was already stored. `WEBHOOK_ENROLLMENT_UNAVAILABLE`: no webhook provider could enroll the deposit address. `REGISTRATION_BUSY`: too many registrations are in flight; the request waited briefly for a slot and none freed. `REGISTRATION_IN_PROGRESS`: another request is registering the same account or salt.
- `500`: Internal error
- `503`: The session scope could not be verified; nothing was stored. Retry after the number of seconds in the Retry-After header.

## Changes

- **2026-11-06** `aa1767d704fa`: 5 info
  - the endpoint scheme security `internalProjectBearer` was added to the API
  - the endpoint scheme security `tenantApiKey` was added to the API
  - the `header` request parameter `x-api-key` became optional
  - added the non-success response with the status `401`
  - …1 more
- **2026-09-30** `a6fd693c3d5f`: 1 info
  - added the non-success response with the status `409`
- **2026-09-17** `676300ac19ff`: 4 info
  - added the optional property `code` to the response with the `400` status
  - added the optional property `code` to the response with the `403` status
  - added the optional property `code` to the response with the `500` status
  - added the optional property `code` to the response with the `503` status
- **2026-09-11** `b49146029e5a`: 1 info
  - added the new optional request property `account/accountParams/sessionScopes`
- **2026-07-29** `7f6aae39bb48`: 1 info
  - added the non-success response with the status `503`

[Operation history](https://skmtc.dev/rhinestonewtf/apis/deposit-service-api/changes/register/post.md)

---

[API](https://skmtc.dev/rhinestonewtf/apis/deposit-service-api.md) - [All operations](https://skmtc.dev/rhinestonewtf/apis/deposit-service-api/llms.txt) - [OpenAPI document](https://skmtc.dev/rhinestonewtf/apis/deposit-service-api/revisions/aa1767d704fa?raw)
