Skip to main content

Go SDK

Installation

go get github.com/jonah-space/poltrading/sdk

Quick Start

package main

import (
"context"
"fmt"
"log"
"time"

"github.com/jonah-space/poltrading/sdk"
)

func main() {
client := sdk.NewClient(
sdk.WithBaseURL("https://outpost.poltrading.com"),
sdk.WithHMACKey("your-hex-hmac-key"),
)

ctx := context.Background()

// List markets
markets, err := client.ListMarkets(ctx)
if err != nil {
log.Fatal(err)
}
for _, m := range markets {
fmt.Printf("Market: %s\n", m.ConditionID)
}

// Get quote
quote, err := client.GetQuote(ctx, "0x0000...0001")
if err != nil {
log.Fatal(err)
}
fmt.Printf("Price: %s\n", quote.Price)

// Submit order
result, err := client.SubmitOrder(ctx, &sdk.Order{
MarketID: "0x0000...0001",
Payload: signedOrderBytes,
Deadline: time.Now().Add(5 * time.Minute).Unix(),
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("Order result: %+v\n", result)
}

API Reference

sdk.NewClient(opts ...Option) *Client

Create a new client with functional options.

Options

OptionDescription
sdk.WithBaseURL(url)Set Outpost endpoint
sdk.WithHMACKey(key)Set hex-encoded HMAC key
sdk.WithTimeout(d)Set request timeout
sdk.WithHTTPClient(c)Use custom *http.Client

Methods

MethodDescription
client.ListMarkets(ctx) ([]Market, error)List active markets
client.GetMarket(ctx, id) (*Market, error)Get market by condition ID
client.GetQuote(ctx, id) (*Quote, error)Get quote data
client.SubmitOrder(ctx, *Order) (*OrderResult, error)Submit signed order
client.Healthz(ctx) (*Health, error)Get health status

HMAC Signing

func signRequest(hmacKey string, body []byte) map[string]string {
timestamp := strconv.FormatInt(time.Now().Unix(), 10)
nonce := make([]byte, 16)
rand.Read(nonce)
nonceHex := hex.EncodeToString(nonce)

mac := hmac.New(sha256.New, []byte(hmacKey))
mac.Write([]byte(timestamp + "." + nonceHex + "."))
mac.Write(body)
sig := "v1=" + hex.EncodeToString(mac.Sum(nil))

return map[string]string{
"X-Outpost-Timestamp": timestamp,
"X-Outpost-Nonce": nonceHex,
"X-Outpost-Signature": sig,
}
}

Error Handling

result, err := client.SubmitOrder(ctx, order)
if err != nil {
var geoErr *sdk.GeoBlockedError
if errors.As(err, &geoErr) {
fmt.Printf("Access blocked in: %s\n", geoErr.Country)
} else {
log.Printf("API error: %v", err)
}
}

Context Propagation

All methods accept context.Context for cancellation and timeouts:

ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

markets, err := client.ListMarkets(ctx)