gRPC

Stream real-time trading signals as they are generated by Guardis. Signals are dispatched immediately upon detection, giving you the fastest possible access to actionable opportunities.

Endpoint

enterprise.guardis.io:443

Authentication

Include your API key in the request metadata using the x-api-key field.

x-api-key: your_api_key_here

Service Definition

syntax = "proto3";

package guardis.signals.v1;

import "google/protobuf/timestamp.proto";

service SignalsService {
  // Stream signals in real-time as they are generated
  rpc StreamSignals(StreamSignalsRequest) returns (stream Signal);
}

message StreamSignalsRequest {
  // Optional: Filter by model name. If empty, all models are included.
  optional string model_name = 1;
}

message Signal {
  // Unique identifier for this signal
  int64 row_id = 1;
  // The mint address of the token
  string token_address = 2;
  // The on-chain address of the liquidity pool
  string pair_address = 3;
  // URL to the token image
  string image = 4;
  // Token name
  string name = 5;
  // Token ticker symbol
  string symbol = 6;
  // Market cap at signal time (USD)
  string signal_market_cap = 7;
  // Pool liquidity at signal time (USD)
  string liquidity_usd = 8;
  // All-time high market cap after signal (USD)
  string ath_market_cap_usd = 9;
  // Maximum ROI percentage from signal to ATH
  string roi_percentage = 10;
  // Maximum drawdown percentage before ATH
  string max_drawdown_percentage = 11;
  // Market cap at maximum drawdown (USD)
  string max_drawdown_market_cap = 12;
  // Signal model version
  int32 version = 13;
  // Name of the model that generated this signal
  string model_name = 14;
  // Timestamp when the signal was generated
  google.protobuf.Timestamp created_at = 15;
}

Request Parameters

StreamSignalsRequest

Field
Type
Required
Description

model_name

string

No

Filter by model name. If omitted, signals from all models are streamed


Response Format

Signal

Field
Type
Description

row_id

int64

Unique identifier for this signal

token_address

string

The mint address of the token

pair_address

string

The on-chain address of the liquidity pool

image

string

URL to the token image

name

string

Token name

symbol

string

Token ticker symbol

signal_market_cap

string

Market cap at the time of signal generation (USD)

liquidity_usd

string

Pool liquidity at signal time (USD)

ath_market_cap_usd

string

All-time high market cap achieved after signal (USD)

roi_percentage

string

Maximum ROI percentage from signal to ATH

max_drawdown_percentage

string

Maximum drawdown percentage before reaching ATH

max_drawdown_market_cap

string

Market cap at the point of maximum drawdown (USD)

version

int32

Signal model version

model_name

string

Name of the model that generated this signal

created_at

google.protobuf.Timestamp

Timestamp when the signal was generated

Note: Decimal values are returned as strings to preserve precision.


Example Usage

Python:

import grpc
from guardis.signals.v1 import signals_pb2, signals_pb2_grpc

metadata = [("x-api-key", "your_api_key_here")]

with grpc.secure_channel("enterprise.guardis.io:443", grpc.ssl_channel_credentials()) as channel:
    stub = signals_pb2_grpc.SignalsServiceStub(channel)
    
    # Stream all signals
    request = signals_pb2.StreamSignalsRequest()
    
    # Or filter by model
    # request = signals_pb2.StreamSignalsRequest(model_name="influx_high_on_dip")
    
    for signal in stub.StreamSignals(request, metadata=metadata):
        print(f"🚀 New Signal: {signal.name} ({signal.symbol})")
        print(f"   Token: {signal.token_address}")
        print(f"   Market Cap: ${float(signal.signal_market_cap):,.2f}")
        print(f"   Model: {signal.model_name}")
        print(f"   Historical ROI: {float(signal.roi_percentage):.2f}%")
        
        # Execute your trading logic here

Go:

package main

import (
    "context"
    "log"

    "google.golang.org/grpc"
    "google.golang.org/grpc/credentials"
    "google.golang.org/grpc/metadata"
    
    pb "github.com/your-org/guardis-go/signals/v1"
)

func main() {
    creds := credentials.NewTLS(nil)
    conn, err := grpc.Dial("enterprise.guardis.io:443", grpc.WithTransportCredentials(creds))
    if err != nil {
        log.Fatalf("Failed to connect: %v", err)
    }
    defer conn.Close()

    client := pb.NewSignalsServiceClient(conn)

    ctx := metadata.AppendToOutgoingContext(
        context.Background(),
        "x-api-key", "your_api_key_here",
    )

    // Stream all signals
    request := &pb.StreamSignalsRequest{}
    
    // Or filter by model
    // request := &pb.StreamSignalsRequest{ModelName: proto.String("influx_high_on_dip")}

    stream, err := client.StreamSignals(ctx, request)
    if err != nil {
        log.Fatalf("Failed to stream: %v", err)
    }

    for {
        signal, err := stream.Recv()
        if err != nil {
            log.Fatalf("Stream error: %v", err)
        }
        
        log.Printf("🚀 New Signal: %s (%s)", signal.Name, signal.Symbol)
        log.Printf("   Token: %s", signal.TokenAddress)
        log.Printf("   Market Cap: $%s", signal.SignalMarketCap)
        log.Printf("   Model: %s", signal.ModelName)
        log.Printf("   Historical ROI: %s%%", signal.RoiPercentage)
        
        // Execute your trading logic here
    }
}

Connection Best Practices

  • Act quickly — Signals are time-sensitive; process them immediately upon receipt

  • Implement reconnection logic — Network interruptions happen; automatically reconnect with exponential backoff

  • Use deadlines — Set appropriate deadlines for your streaming calls to handle stale connections

  • Handle stream errors gracefully — Check for io.EOF and gRPC status codes to determine if reconnection is needed

  • Log signals — Maintain a local record of received signals for analysis and debugging

Last updated