0. Prerequisites

API credentials are required for this guide. If you have not already gone through the API setup guide, go through those steps now.

1. Create a wallet

Let’s create a simple Ethereum wallet:

curl --request POST \
  --url https://api.privy.io/v1/wallets \
  --header 'Authorization: Basic <encoded-value>' \
  --header 'Content-Type: application/json' \
  --header 'privy-app-id: <privy-app-id>' \
  --data '{
  "chain_type": "ethereum"
}'

Authorization signatures are an optional security improvement that requires all requests to be authorized by you.

The response will include the wallet ID and public address:

{
  "id": "jf4mev19seymsqulciv8on0c",
  "address": "0x7Ef5363308127128969618240eDcB9F8f61e90F6",
  "chain_type": "ethereum",
  "policy_ids": [],
  "created_at": 1741362961254
}

2. Sign a message

Now let’s sign a message with our new wallet:

curl --request POST \
  --url https://api.privy.io/v1/wallets/{wallet_id}/rpc \
  --header 'Authorization: Basic <encoded-value>' \
  --header 'Content-Type: application/json' \
  --header 'privy-app-id: <privy-app-id>' \
  --data '{
  "method": "personal_sign",
  "params": {
    "message": "Hello from Privy!",
    "encoding": "utf-8"
  }
}'

The response will contain the signed message:

{
  "method": "personal_sign",
  "data": {
    "signature": "0x292d67e9c5178447f1c5344b3122997dfba8f00e43102d0b746301e9b4afbbf67d952bf870878d92b8eb066da205840458c0a5fb3f53253dbe1adf9c143678311c",
    "encoding": "hex"
  }
}

3. Send a transaction

Finally, let’s send a transaction on Ethereum’s testnet, Sepolia:

curl --request POST \
  --url https://api.privy.io/v1/wallets/{wallet_id}/rpc \
  --header 'Authorization: Basic <encoded-value>' \
  --header 'Content-Type: application/json' \
  --header 'privy-app-id: <privy-app-id>' \
  --data '{
  "method": "eth_sendTransaction",
  "caip2": "eip155:11155111",
  "chain_type": "ethereum",
  "params": {
    "transaction": {
      "to": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
      "value": 1000000000000000
    }
  }
}'

You will need to fund your wallet with Sepolia ETH for this step. Use a Sepolia faucet and send it to the public address.

The response will contain the transaction hash and a Privy transaction ID:

{
  "method": "eth_sendTransaction",
  "data": {
    "hash": "0x7c91ba85d67ef92cc15f3e9c8d8c5788e982cf83fabe9bfcc66a747aa0bd3701",
    "caip2": "eip155:11155111",
    "transaction_id": "d2obiyxnblv7jzp73b8scqa8"
  }
}

Next steps

Now that you’ve created a wallet and made your first transaction, you can explore:

  1. Creating policies to control wallet spending and contract interaction
  2. Setting up webhooks for real-time transaction notifications
  3. Using idempotency keys to prevent duplicate transactions
  4. Setting up quorum authorizations for sensitive wallets

0. Prerequisites

API credentials are required for this guide. If you have not already gone through the API setup guide, go through those steps now.

1. Create a wallet

Let’s create a simple Ethereum wallet:

curl --request POST \
  --url https://api.privy.io/v1/wallets \
  --header 'Authorization: Basic <encoded-value>' \
  --header 'Content-Type: application/json' \
  --header 'privy-app-id: <privy-app-id>' \
  --data '{
  "chain_type": "ethereum"
}'

Authorization signatures are an optional security improvement that requires all requests to be authorized by you.

The response will include the wallet ID and public address:

{
  "id": "jf4mev19seymsqulciv8on0c",
  "address": "0x7Ef5363308127128969618240eDcB9F8f61e90F6",
  "chain_type": "ethereum",
  "policy_ids": [],
  "created_at": 1741362961254
}

2. Sign a message

Now let’s sign a message with our new wallet:

curl --request POST \
  --url https://api.privy.io/v1/wallets/{wallet_id}/rpc \
  --header 'Authorization: Basic <encoded-value>' \
  --header 'Content-Type: application/json' \
  --header 'privy-app-id: <privy-app-id>' \
  --data '{
  "method": "personal_sign",
  "params": {
    "message": "Hello from Privy!",
    "encoding": "utf-8"
  }
}'

The response will contain the signed message:

{
  "method": "personal_sign",
  "data": {
    "signature": "0x292d67e9c5178447f1c5344b3122997dfba8f00e43102d0b746301e9b4afbbf67d952bf870878d92b8eb066da205840458c0a5fb3f53253dbe1adf9c143678311c",
    "encoding": "hex"
  }
}

3. Send a transaction

Finally, let’s send a transaction on Ethereum’s testnet, Sepolia:

curl --request POST \
  --url https://api.privy.io/v1/wallets/{wallet_id}/rpc \
  --header 'Authorization: Basic <encoded-value>' \
  --header 'Content-Type: application/json' \
  --header 'privy-app-id: <privy-app-id>' \
  --data '{
  "method": "eth_sendTransaction",
  "caip2": "eip155:11155111",
  "chain_type": "ethereum",
  "params": {
    "transaction": {
      "to": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
      "value": 1000000000000000
    }
  }
}'

You will need to fund your wallet with Sepolia ETH for this step. Use a Sepolia faucet and send it to the public address.

The response will contain the transaction hash and a Privy transaction ID:

{
  "method": "eth_sendTransaction",
  "data": {
    "hash": "0x7c91ba85d67ef92cc15f3e9c8d8c5788e982cf83fabe9bfcc66a747aa0bd3701",
    "caip2": "eip155:11155111",
    "transaction_id": "d2obiyxnblv7jzp73b8scqa8"
  }
}

Next steps

Now that you’ve created a wallet and made your first transaction, you can explore:

  1. Creating policies to control wallet spending and contract interaction
  2. Setting up webhooks for real-time transaction notifications
  3. Using idempotency keys to prevent duplicate transactions
  4. Setting up quorum authorizations for sensitive wallets