Trading
The Trading API lets an Alpaca account inspect account state, discover tradable assets, submit and manage orders, read positions, and receive live order lifecycle updates.
For common workflows, start with the immutable AlpacaClient facade. When you need an endpoint
that does not yet have a handwritten helper, create a fresh generated Trading client from
client.newTradingClient() or AlpacaClientFactory.tradingClient(...).
Paper trading
Paper trading is the default environment for AlpacaClient. Make sure the credentials you load are
paper credentials when you use TradingApiEnvironment.PAPER.
import markets.alpaca.client.AlpacaClient;
import markets.alpaca.client.AlpacaCredentials;
import markets.alpaca.client.TradingApiEnvironment;
var credentials = AlpacaCredentials.fromTradingApiEnvironmentVariables();
var client = AlpacaClient.builder(credentials)
.tradingEnvironment(TradingApiEnvironment.PAPER)
.build();
Use TradingApiEnvironment.PRODUCTION only when you intentionally want live trading.
Account details
Account, asset, position, and portfolio-history endpoints are available through the generated Trading REST APIs. The generated client is already configured with the correct base URL and authentication headers.
import markets.alpaca.client.openapi.trading.api.AccountsApi;
var trading = client.newTradingClient();
var accounts = new AccountsApi(trading);
var account = accounts.getAccount();
System.out.println(account.getBuyingPower());
Assets
The Assets API can be used to confirm that a symbol is active, tradable, and fractionable before placing an order.
import markets.alpaca.client.openapi.trading.api.AssetsApi;
var assets = new AssetsApi(client.newTradingClient());
var aapl = assets.getV2AssetsSymbolOrAssetId("AAPL");
System.out.printf(
"symbol=%s tradable=%s fractionable=%s%n",
aapl.getSymbol(),
aapl.getTradable(),
aapl.getFractionable());
Orders
Use client.orders() for the SDK's typed order-list helper. It wraps the generated
GET /v2/orders method with named parameters and local validation for limits and pagination modes.
import markets.alpaca.client.openapi.trading.model.AssetClass;
import markets.alpaca.client.trading.ListOrdersRequest;
var openOrders = client.orders().list(ListOrdersRequest.builder()
.status(ListOrdersRequest.Status.OPEN)
.symbols("AAPL")
.assetClasses(AssetClass.US_EQUITY)
.limit(50)
.direction(ListOrdersRequest.Direction.DESC)
.nested(true)
.build());
Submitting, canceling, and loading orders by ID are available through the generated OrdersApi.
Keep order-submission retries conservative: order placement is not an idempotent operation unless
your application manages client order IDs carefully.
import java.util.UUID;
import markets.alpaca.client.openapi.trading.api.OrdersApi;
import markets.alpaca.client.openapi.trading.model.OrderSide;
import markets.alpaca.client.openapi.trading.model.OrderType;
import markets.alpaca.client.openapi.trading.model.PostOrderRequest;
import markets.alpaca.client.openapi.trading.model.TimeInForce;
var ordersApi = new OrdersApi(client.newTradingClient());
var clientOrderId = "my-app-" + UUID.randomUUID();
var request = new PostOrderRequest()
.symbol("AAPL")
.qty("1")
.side(OrderSide.BUY)
.type(OrderType.LIMIT)
.limitPrice("0.01")
.timeInForce(TimeInForce.DAY)
.clientOrderId(clientOrderId);
var order = ordersApi.postOrder(request);
ordersApi.deleteOrderByOrderID(order.getId());
Positions
Use the generated PositionsApi to inspect open positions. State-changing calls such as closing
positions should be guarded in your application in the same way as order submission.
import markets.alpaca.client.openapi.trading.api.PositionsApi;
var positions = new PositionsApi(client.newTradingClient());
positions.getAllOpenPositions().forEach(position ->
System.out.printf(
"%s qty=%s marketValue=%s%n",
position.getSymbol(),
position.getQty(),
position.getMarketValue()));
Portfolio history
Portfolio history is also exposed through the generated Trading client.
import markets.alpaca.client.openapi.trading.api.PortfolioHistoryApi;
var portfolio = new PortfolioHistoryApi(client.newTradingClient());
var history = portfolio.getAccountPortfolioHistory(
"1M", "1D", null, null, null, null, null, null);
System.out.println(history.getEquity());
Streaming trade updates
Trading stream updates arrive through a WebSocket client. Use the PAPER stream for paper keys and
PRODUCTION for live keys.
import markets.alpaca.client.AlpacaClientFactory;
import markets.alpaca.client.ws.TradingEnvironment;
import markets.alpaca.client.ws.TradingStreamListener;
import markets.alpaca.client.ws.TradingSubscription;
import markets.alpaca.client.ws.model.TradeUpdate;
var stream = AlpacaClientFactory.tradingStream(
credentials,
TradingEnvironment.PAPER,
new TradingStreamListener() {
@Override
public void onTradeUpdate(TradeUpdate update) {
System.out.println(update);
}
});
stream.connect(TradingSubscription.TRADE_UPDATES);
For authentication confirmation, listener executors, reconnect behavior, and the differences between Trading, Market Data, and Broker live-event clients, see Streaming and events.
See the full runnable Trading workflow in
examples/src/main/java/markets/alpaca/client/examples/TradingApiExample.java.