Introducing Signal Stream
Image credit: ESA/Hubble & NASA

Introducing Signal Stream

By The astronomer Team

Signal Stream Client

Signal Stream lets you run a server, local or hosted, that receives open Astronomer trading signals as they are created.

Signals are only sent live, so keep your server up through signal delivery hours (10:00 AM to 3:00 PM Eastern on weekdays) or catch anything you miss on the Astronomer website.

Install

npm install @astronomer-app/signals

The examples below use TypeScript. Python, Go, and Rust examples are coming soon.

Run A Server

Put your Signal Stream key in an environment variable:

ASTRONOMER_SIGNAL_STREAM_KEY=ast_live_...

Create the client and open the connection. The process stays alive and handles signals as they arrive:

import { AstronomerSignals } from '@astronomer-app/signals';

const client = new AstronomerSignals({
  apiKey: process.env.ASTRONOMER_SIGNAL_STREAM_KEY!,
});

const listener = client.signals.listen({
  onSignal(event) {
    console.log(event.signal);
  },
  onError(error) {
    console.error(error);
  },
});

process.on('SIGINT', async () => {
  await listener.close();
  process.exit(0);
});

What A Signal Contains

Each event wraps the signal that triggered it:

{
  "type": "signal.created",
  "createdAt": "2026-06-18T11:00:00",
  "signal": {
    "id": "209",
    "symbol": "SPY",
    "optionType": "C",
    "strikePrice": 746,
    "openedAt": "2026-06-18T11:38:00"
  }
}

The symbol, optionType, and strikePrice fields name a single option contract, which is everything you need to build an order.

Place Orders Automatically

Since each signal fully describes a contract, you can submit an order straight from the onSignal callback.

const listener = client.signals.listen({
  async onSignal({ signal }) {
    try {
      await broker.placeOptionOrder({
        symbol: signal.symbol,
        right: signal.optionType,
        strike: signal.strikePrice,
        side: 'buy',
        quantity: 1,
        type: 'limit',
        limitPrice: 1.5,
      });
    } catch (error) {
      console.error(`Order failed for signal ${signal.symbol}:`, error);
    }
  },
  onError(error) {
    console.error(error);
  },
});

In the example broker is your broker's SDK, such as Alpaca, Interactive Brokers, etc.

You can also integrate this flow into your IRA accounts on ETrade, or Thinkorswim. We will cover all integrations in separate blog posts.