Skip to content

Client Integration

Build custom integrations with the Matchstick Events stream.

For Developers

This guide is for developers building their own applications. Most users should just download the desktop app.

React

tsx
import { useEffect, useState } from 'react';

interface MarketEvent {
  eventType: string;
  issuer: string;
  filedAt: string;
  metadata?: Record<string, unknown>;
}

export function useEventStream() {
  const [events, setEvents] = useState<MarketEvent[]>([]);
  const [connected, setConnected] = useState(false);

  useEffect(() => {
    const source = new EventSource(
      'https://events.matchstick.trading/api/stream'
    );

    source.onopen = () => setConnected(true);

    source.onmessage = (e) => {
      const event = JSON.parse(e.data);
      setEvents((prev) => [event, ...prev].slice(0, 100));
    };

    source.onerror = () => setConnected(false);

    return () => source.close();
  }, []);

  return { events, connected };
}

// Usage
function EventFeed() {
  const { events, connected } = useEventStream();

  return (
    <div>
      <div>Status: {connected ? 'Connected' : 'Disconnected'}</div>
      {events.map((event, i) => (
        <div key={i}>
          {event.eventType}: {event.issuer}
        </div>
      ))}
    </div>
  );
}

Vue 3

vue
<script setup lang="ts">
import { ref, onMounted, onUnmounted } from 'vue';

interface MarketEvent {
  eventType: string;
  issuer: string;
  filedAt: string;
}

const events = ref<MarketEvent[]>([]);
const connected = ref(false);
let source: EventSource | null = null;

onMounted(() => {
  source = new EventSource('https://events.matchstick.trading/api/stream');
  source.onopen = () => (connected.value = true);
  source.onmessage = (e) => {
    events.value = [JSON.parse(e.data), ...events.value].slice(0, 100);
  };
  source.onerror = () => (connected.value = false);
});

onUnmounted(() => source?.close());
</script>

<template>
  <div>
    <div>Status: {{ connected ? 'Connected' : 'Disconnected' }}</div>
    <div v-for="(event, i) in events" :key="i">
      {{ event.eventType }}: {{ event.issuer }}
    </div>
  </div>
</template>

Node.js

typescript
import EventSource from 'eventsource';

const source = new EventSource(
  'https://events.matchstick.trading/api/stream'
);

source.onmessage = (event) => {
  const data = JSON.parse(event.data);
  console.log('Event:', data.eventType, data.issuer);
};

source.onerror = (error) => {
  console.error('Connection error:', error);
};

// Graceful shutdown
process.on('SIGINT', () => {
  source.close();
  process.exit(0);
});

Python

python
import sseclient
import requests
import json

def stream_events():
    url = 'https://events.matchstick.trading/api/stream'
    response = requests.get(url, stream=True)
    client = sseclient.SSEClient(response)

    for event in client.events():
        if event.data:
            data = json.loads(event.data)
            print(f"Event: {data['eventType']} - {data['issuer']}")

if __name__ == '__main__':
    stream_events()

Reconnection

Always implement reconnection with exponential backoff:

typescript
function createConnection(onEvent: (data: any) => void) {
  let source: EventSource | null = null;
  let retryCount = 0;

  function connect() {
    source = new EventSource('/api/stream');

    source.onopen = () => {
      retryCount = 0;
    };

    source.onmessage = (e) => onEvent(JSON.parse(e.data));

    source.onerror = () => {
      source?.close();
      const delay = Math.min(1000 * 2 ** retryCount, 30000);
      setTimeout(connect, delay);
      retryCount++;
    };
  }

  connect();
  return () => source?.close();
}

Built for traders who value data provenance.